From e6859c5a8f08c137e1cd820055332c5afdc8e00c Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Mon, 30 Jun 2025 16:02:18 +0300 Subject: [PATCH] Use batchs for finding persons --- .../mapper/indic/PersonMapper.java | 4 +- .../credit_tracker/service/SignalService.java | 31 ++++++-- .../service/indic/PersonService.java | 76 ++++++++++++++++--- .../mybatis/mapper/indic/PersonMapper.xml | 19 +++-- 4 files changed, 103 insertions(+), 27 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 07b1d1b..bcb14a7 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 @@ -9,7 +9,7 @@ import java.util.List; @Mapper public interface PersonMapper { - PersonService.NameData findNameData(@Param("fid") Integer fid); + List findNameData(@Param("fids") List fids); - List findPassportData(@Param("fid") Integer fid); + List findPassportData(@Param("fids") List fids); } 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 3a98082..a8768ca 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -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 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 findPersons(List fidsPhoneData) { + List persons = new ArrayList<>(); + Map 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; } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java index 292680a..c94c1c6 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java @@ -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 findPersonData(List fids) { + Map personDataMap = new HashMap<>(); + Map nameDataMap = findNameData(fids); + Map passortDataMap = findPassportData(fids); - if (person != null && passort != null && requiredFieldPresent(person, passort)) { - return new PersonData(person, passort); - } else { - log.warn("Person does not have required fields. Fid {}", fid); - return null; - } + + fids.forEach(fid -> { + NameData person = nameDataMap.get(fid); + PassportData passort = passortDataMap.get(fid); + if (person != null && passort != null && requiredFieldPresent(person, passort)) { + personDataMap.put(fid, new PersonData(person, passort)); + } else { + log.warn("Person does not have required fields. Fid {}", fid); + } + }); + + return personDataMap; } - private PassportData findPassportData(Integer fid) { - List passports = mapper.findPassportData(fid); - List documents = passports.stream().filter(this::isDUL).toList(); // берем только ДУЛ + private Map findNameData(List fids) { + List 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 findPassportData(List fids) { + Map passportDataMap = new HashMap<>(); + + List 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 passports) { + List 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; diff --git a/src/main/resources/mybatis/mapper/indic/PersonMapper.xml b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml index 243c825..1583ad9 100644 --- a/src/main/resources/mybatis/mapper/indic/PersonMapper.xml +++ b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml @@ -6,13 +6,16 @@ + + + @@ -22,17 +25,21 @@ \ No newline at end of file