Use batchs for finding persons

This commit is contained in:
Mikhail Trofimov 2025-06-30 16:02:18 +03:00
parent 4af0bad507
commit e6859c5a8f
4 changed files with 103 additions and 27 deletions

View file

@ -9,7 +9,7 @@ import java.util.List;
@Mapper
public interface PersonMapper {
PersonService.NameData findNameData(@Param("fid") Integer fid);
List<PersonService.NameData> findNameData(@Param("fids") List<Integer> fids);
List<PersonService.PassportData> findPassportData(@Param("fid") Integer fid);
List<PersonService.PassportData> findPassportData(@Param("fids") List<Integer> fids);
}

View file

@ -93,7 +93,7 @@ public class SignalService {
FlagsService.FlagsData flagsData = flagsDataMap.get(data.getFid());
subject = new SubjectData(data.getId(), packageId, data.getSubjectId(), data.getPhone(), data.getFid(), flagsData.getFlagDebt5000(), flagsData.getFlag90days(), calculatedAt);
} else {
subject = new SubjectData(data.getId(), packageId, data.getSubjectId(), data.getPhone(),null, null, null, calculatedAt);
subject = new SubjectData(data.getId(), packageId, data.getSubjectId(), data.getPhone(), null, null, null, calculatedAt);
}
subjectToUpdate.add(subject);
});
@ -124,18 +124,35 @@ public class SignalService {
Auth auth = new Auth();
auth.setUser(config.getSignalsuser());
signals.setAuth(auth);
for (PhoneService.FidsPhoneData fidData : fids) {
Person person = findPerson(fidData.getFid(), fidData.getSubjectId());
if (person != null) {
signals.getConditions().getPersons().getPerson().add(person);
for (int i = 0; i < fids.size(); i += batchSize) {
int end = Math.min(i + batchSize, fids.size());
List<Person> persons = findPersons(fids.subList(i, end));
if (!persons.isEmpty()) {
signals.getConditions().getPersons().getPerson().addAll(persons);
}
}
return signals;
}
private Person findPerson(Integer fid, String id) {
PersonService.PersonData personData = personService.findPersonData(fid);
private List<Person> findPersons(List<PhoneService.FidsPhoneData> fidsPhoneData) {
List<Person> persons = new ArrayList<>();
Map<Integer, PersonService.PersonData> personFidMap = personService.findPersonData(fidsPhoneData.stream()
.map(PhoneService.FidsPhoneData::getFid)
.filter(Objects::nonNull).toList());
fidsPhoneData.forEach(data -> {
if (data.getFid() != null) {
PersonService.PersonData personData = personFidMap.get(data.getFid());
Person person = getPerson(personData, data.getSubjectId());
if (person != null) {
persons.add(person);
}
}
});
return persons;
}
private Person getPerson(PersonService.PersonData personData, String id) {
if (personData == null) {
return null;
}

View file

@ -10,7 +10,10 @@ import ru.nbch.credit_tracker.mapper.indic.PersonMapper;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
@ -22,22 +25,68 @@ public class PersonService {
this.mapper = mapper;
}
public PersonData findPersonData(Integer fid) {
NameData person = mapper.findNameData(fid);
PassportData passort = findPassportData(fid);
public Map<Integer, PersonData> findPersonData(List<Integer> fids) {
Map<Integer, PersonData> personDataMap = new HashMap<>();
Map<Integer, NameData> nameDataMap = findNameData(fids);
Map<Integer, PassportData> passortDataMap = findPassportData(fids);
fids.forEach(fid -> {
NameData person = nameDataMap.get(fid);
PassportData passort = passortDataMap.get(fid);
if (person != null && passort != null && requiredFieldPresent(person, passort)) {
return new PersonData(person, passort);
personDataMap.put(fid, new PersonData(person, passort));
} else {
log.warn("Person does not have required fields. Fid {}", fid);
return null;
}
});
return personDataMap;
}
private PassportData findPassportData(Integer fid) {
List<PassportData> passports = mapper.findPassportData(fid);
List<PassportData> documents = passports.stream().filter(this::isDUL).toList(); // берем только ДУЛ
private Map<Integer, NameData> findNameData(List<Integer> fids) {
List<NameData> persons = mapper.findNameData(fids);
return persons.stream()
.collect(Collectors.toMap(NameData::getFid, nameData -> nameData,
(existing, replacement) -> {
LocalDate existingDate = existing.getFileSinceDate();
LocalDate replacementDate = replacement.getFileSinceDate();
if (existingDate != null && replacementDate != null) {
if (existingDate.isAfter(replacementDate)) {
return existing;
} else {
return replacement;
}
} else if (existingDate != null) {
return existing;
} else {
return replacement;
}
}));
}
private Map<Integer, PassportData> findPassportData(List<Integer> fids) {
Map<Integer, PassportData> passportDataMap = new HashMap<>();
List<PassportData> passports = mapper.findPassportData(fids);
fids.forEach(fid -> {
PassportData passport = findPassport(passports.stream()
.filter(passportData -> passportData.getFid().equals(fid))
.collect(Collectors.toList()));
if (passport != null) {
passportDataMap.put(fid, passport);
}
});
return passportDataMap;
}
private PassportData findPassport(List<PassportData> passports) {
List<PassportData> documents = passports.stream()
.filter(this::isDUL)
.toList(); // берем только ДУЛ
if (documents.isEmpty()) {
return null;
@ -105,15 +154,18 @@ public class PersonService {
@Getter
@Setter
public static class NameData {
private Integer fid;
private String firstName;
private String lastName;
private String middleName;
private LocalDate birthDate;
private LocalDate fileSinceDate;
}
@Getter
@Setter
public static class PassportData {
private Integer fid;
private String serNum;
private String idNum;
private LocalDate issDate;

View file

@ -6,13 +6,16 @@
<mapper namespace="ru.nbch.credit_tracker.mapper.indic.PersonMapper">
<resultMap id="nameDataResultMap" type="ru.nbch.credit_tracker.service.indic.PersonService$NameData">
<result property="fid" column="FID" />
<result property="firstName" column="FIRST" />
<result property="lastName" column="NAME_1" />
<result property="middleName" column="MIDDLE" />
<result property="birthDate" column="BIRTH_DT" />
<result property="fileSinceDate" column="FILE_SINCE_DT" />
</resultMap>
<resultMap id="passportDataResultMap" type="ru.nbch.credit_tracker.service.indic.PersonService$PassportData">
<result property="fid" column="FID" />
<result property="serNum" column="SER_NUM" />
<result property="idNum" column="ID_NUM" />
<result property="issDate" column="ISS_DTE" />
@ -22,17 +25,21 @@
</resultMap>
<select id="findNameData" resultMap="nameDataResultMap">
SELECT FIRST, NAME_1, MIDDLE, BIRTH_DT
SELECT FID, FIRST, NAME_1, MIDDLE, BIRTH_DT, FILE_SINCE_DT
FROM NAME
WHERE FID = #{fid}
ORDER BY FILE_SINCE_DT DESC
LIMIT 1
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
</select>
<select id="findPassportData" resultMap="passportDataResultMap" resultType="java.util.List">
SELECT SER_NUM, ID_NUM, ISS_DTE, FILE_SINCE_DT, ID_TYPE, ID_TYPE2
SELECT FID, SER_NUM, ID_NUM, ISS_DTE, FILE_SINCE_DT, ID_TYPE, ID_TYPE2
FROM ID
WHERE FID = #{fid}
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
</select>
</mapper>