Use batchs for finding persons
This commit is contained in:
parent
4af0bad507
commit
e6859c5a8f
4 changed files with 103 additions and 27 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
Loading…
Add table
Reference in a new issue