From ebbbd1b575fed1965b9d1e72696bd8f8b5c34fd0 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Mon, 9 Jun 2025 17:50:00 +0300 Subject: [PATCH] Added generation request logic to nbki signal service; Added type handlers for IndicDataSourceConfig; --- signal-package.xsd | 71 ++++++++++ .../datasource/IndicDataSourceConfig.java | 1 + .../handlers/BigIntegerTypeHandler.java | 62 +++++++++ .../handlers/LocalDateTypeHandler.java | 47 +++++++ .../config/settings/XsdValidation.java | 3 +- .../entities/signal_package/Auth.java | 21 +++ .../entities/signal_package/Conditions.java | 25 ++++ .../entities/signal_package/Person.java | 75 +++++++++++ .../entities/signal_package/Persons.java | 28 ++++ .../entities/signal_package/Signals.java | 35 +++++ .../credit_tracker/facade/SignalFacade.java | 10 +- .../mapper/indic/PersonMapper.java | 15 +++ .../credit_tracker/service/SignalService.java | 96 ++++++++++++- .../service/indic/PersonService.java | 127 ++++++++++++++++++ .../service/xml/XmlUtilService.java | 2 + src/main/resources/application.properties | 3 +- .../mybatis/mapper/indic/PersonMapper.xml | 38 ++++++ 17 files changed, 654 insertions(+), 5 deletions(-) create mode 100644 signal-package.xsd create mode 100644 src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java create mode 100644 src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java create mode 100644 src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java create mode 100644 src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java create mode 100644 src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java create mode 100644 src/main/resources/mybatis/mapper/indic/PersonMapper.xml diff --git a/signal-package.xsd b/signal-package.xsd new file mode 100644 index 0000000..d8060de --- /dev/null +++ b/signal-package.xsd @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java b/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java index a19a918..52910ba 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java +++ b/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java @@ -51,6 +51,7 @@ public class IndicDataSourceConfig { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setMapperLocations(resources); + sqlSessionFactoryBean.setTypeHandlersPackage("ru.nbch.credit_tracker.config.datasource.handlers"); return sqlSessionFactoryBean.getObject(); } } diff --git a/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java new file mode 100644 index 0000000..12d9600 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java @@ -0,0 +1,62 @@ +package ru.nbch.credit_tracker.config.datasource.handlers; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedTypes; + +import java.math.BigInteger; +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +@MappedTypes(BigInteger.class) +public class BigIntegerTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, BigInteger parameter, JdbcType jdbcType) throws SQLException { + ps.setLong(i, parameter.longValue()); + } + + @Override + public BigInteger getNullableResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + if (rs.wasNull()) { + return null; + } else { + try { + return BigInteger.valueOf(Long.parseLong(value.trim())); + } catch (NumberFormatException e) { + return null; + } + } + } + + @Override + public BigInteger getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + if (rs.wasNull()) { + return null; + } else { + try { + return BigInteger.valueOf(Long.parseLong(value.trim())); + } catch (NumberFormatException e) { + return null; + } + } + } + + @Override + public BigInteger getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + if (cs.wasNull()) { + return null; + } else { + try { + return BigInteger.valueOf(Long.parseLong(value.trim())); + } catch (NumberFormatException e) { + return null; + } + } + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java new file mode 100644 index 0000000..fc09b2c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java @@ -0,0 +1,47 @@ +package ru.nbch.credit_tracker.config.datasource.handlers; + + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.*; +import java.time.LocalDate; + +@MappedTypes(LocalDate.class) +public class LocalDateTypeHandler extends BaseTypeHandler { + @Override + public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType) throws SQLException { + ps.setDate(i, Date.valueOf(parameter)); + } + + @Override + public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException { + Date date = rs.getDate(columnName); + if(rs.wasNull()) { + return null; + } else { + return date.toLocalDate(); + } + } + + @Override + public LocalDate getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + Date date = rs.getDate(columnIndex); + if(rs.wasNull()) { + return null; + } else { + return date.toLocalDate(); + } + } + + @Override + public LocalDate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + Date date = cs.getDate(columnIndex); + if(cs.wasNull()) { + return null; + } else { + return date.toLocalDate(); + } + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java b/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java index 5749fa6..b1bb211 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java +++ b/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java @@ -1,5 +1,6 @@ package ru.nbch.credit_tracker.config.settings; public record XsdValidation ( - String monitoringRequestPath + String monitoringRequestPath, + String signalPackagePath ) {} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java new file mode 100644 index 0000000..bbf5d3c --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java @@ -0,0 +1,21 @@ +package ru.nbch.credit_tracker.entities.signal_package; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "user" +}) +public class Auth { + + @XmlElement(name = "User", required = true) + protected String user; + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java new file mode 100644 index 0000000..0d2fd45 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java @@ -0,0 +1,25 @@ +package ru.nbch.credit_tracker.entities.signal_package; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; +import lombok.Setter; + +@Setter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "persons" +}) +public class Conditions { + + @XmlElement(name = "Persons", required = true) + protected Persons persons; + + public Persons getPersons() { + if (persons == null) { + persons = new Persons(); + } + return persons; + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java new file mode 100644 index 0000000..a07ca93 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java @@ -0,0 +1,75 @@ +package ru.nbch.credit_tracker.entities.signal_package; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "value" +}) +public class Person { + + @XmlValue + protected String value; + @XmlAttribute(name = "uid", required = true) + protected String uid; + @XmlAttribute(name = "s", required = true) + protected String s; + @XmlAttribute(name = "n", required = true) + protected String n; + @XmlAttribute(name = "m") + protected String m; + @XmlAttribute(name = "d", required = true) + @XmlSchemaType(name = "date") + protected String d; + @XmlAttribute(name = "pn", required = true) + protected String pn; + @XmlAttribute(name = "pd", required = true) + @XmlSchemaType(name = "date") + protected String pd; + @XmlAttribute(name = "dt", required = true) + protected String dt; + @XmlAttribute(name = "ip", required = true) + protected String ip; + @XmlAttribute(name = "consentDate") + @XmlSchemaType(name = "date") + protected String consentDate; + @XmlAttribute(name = "consentPurpose") + protected String consentPurpose; + @XmlAttribute(name = "reportUser") + protected String reportUser; + @XmlAttribute(name = "liability") + protected String liability; + @XmlAttribute(name = "consentPeriod") + protected String consentPeriod; + @XmlAttribute(name = "agrDate") + protected String agrDate; + @XmlAttribute(name = "reportUserRegNum") + protected String reportUserRegNum; + @XmlAttribute(name = "reportUserTaxID") + protected String reportUserTaxID; + @XmlAttribute(name = "consentHash") + protected String consentHash; + @XmlAttribute(name = "cS") + protected String cs; + @XmlAttribute(name = "consentN") + protected String consentN; + @XmlAttribute(name = "consentM") + protected String consentM; + @XmlAttribute(name = "consentBd") + @XmlSchemaType(name = "date") + protected String consentBd; + @XmlAttribute(name = "consentPn") + protected String consentPn; + @XmlAttribute(name = "consentPd") + @XmlSchemaType(name = "date") + protected String consentPd; + @XmlAttribute(name = "consentDt") + protected String consentDt; + @XmlAttribute(name = "inqPurpose") + protected String inqPurpose; + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java new file mode 100644 index 0000000..91893a4 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java @@ -0,0 +1,28 @@ +package ru.nbch.credit_tracker.entities.signal_package; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; + +import java.util.ArrayList; +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "person" +}) +public class Persons { + + @XmlElement(name = "p", required = true) + protected List person; + + public List getPerson() { + if (person == null) { + person = new ArrayList<>(); + } + return this.person; + } + + +} diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java new file mode 100644 index 0000000..207721a --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java @@ -0,0 +1,35 @@ + +package ru.nbch.credit_tracker.entities.signal_package; + +import jakarta.xml.bind.annotation.*; +import lombok.Getter; +import lombok.Setter; + + +@Setter +@Getter +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "id", + "auth", + "conditions" +}) +@XmlRootElement(name = "Signals") +public class Signals { + + @XmlElement(name = "Id", required = true) + protected String id; + @XmlElement(name = "Auth", required = true) + protected Auth auth; + @XmlElement(name = "Conditions", required = true) + protected Conditions conditions; + @XmlAttribute(name = "online", required = true) + protected String online; + + public Conditions getConditions() { + if (conditions == null) { + conditions = new Conditions(); + } + return conditions; + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index e79bbd3..c4f4fb2 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -8,13 +8,16 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest; +import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.service.FailureAnswerGenerator; import ru.nbch.credit_tracker.service.SignalService; +import ru.nbch.credit_tracker.service.indic.PhoneService; import ru.nbch.credit_tracker.service.scoring.AuthorizationService; import ru.nbch.credit_tracker.service.xml.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.XmlUtilService; +import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -124,7 +127,12 @@ public class SignalFacade { return getBadResponse(SignalError.ERROR_007); } - signalService.registerPackage(monitoringRequest); + List phoneFidsData = signalService.registerPackage(monitoringRequest); + if(!phoneFidsData.isEmpty()) { + Signals signals = signalService.setupMonitoring(monitoringRequest, phoneFidsData); + // TODO validate? + // TODO marshall to xml and send to nbki signal service + } } catch (Exception e) { log.error(e.getMessage(), e); 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 new file mode 100644 index 0000000..07b1d1b --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java @@ -0,0 +1,15 @@ +package ru.nbch.credit_tracker.mapper.indic; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import ru.nbch.credit_tracker.service.indic.PersonService; + +import java.util.List; + +@Mapper +public interface PersonMapper { + + PersonService.NameData findNameData(@Param("fid") Integer fid); + + List findPassportData(@Param("fid") Integer fid); +} 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 a1f955a..a5a8f92 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -1,28 +1,42 @@ package ru.nbch.credit_tracker.service; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest; +import ru.nbch.credit_tracker.entities.signal_package.Auth; +import ru.nbch.credit_tracker.entities.signal_package.Person; +import ru.nbch.credit_tracker.entities.signal_package.Signals; import ru.nbch.credit_tracker.enums.Status; import ru.nbch.credit_tracker.mapper.signal.SignalMapper; import ru.nbch.credit_tracker.service.indic.FlagsService; +import ru.nbch.credit_tracker.service.indic.PersonService; import ru.nbch.credit_tracker.service.indic.PhoneService; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; import java.util.List; @Service public class SignalService { + private final static DateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy"); + private final SignalMapper mapper; private final PhoneService phoneService; private final FlagsService flagsService; + private final PersonService personService; public SignalService(SignalMapper mapper, PhoneService phoneService, - FlagsService flagsService) { + FlagsService flagsService, PersonService personService) { this.mapper = mapper; this.phoneService = phoneService; this.flagsService = flagsService; + this.personService = personService; } public boolean isPackageNotUnique(MonitoringRequest request) { @@ -30,7 +44,7 @@ public class SignalService { return mapper.isPackageNotUnique(userId.substring(0, 6), request.getPackageName()); } - public void registerPackage(MonitoringRequest request) { + public List registerPackage(MonitoringRequest request) { Integer packageId = mapper.registerPackage(request, LocalDateTime.now(), Status.PROCESSING.name()); mapper.registerSubjects(request.getSubjects().getSubject(), packageId); List fidsPhoneDataList = phoneService.findFidsPhoneData(request.getSubjects().getSubject()); @@ -39,10 +53,88 @@ public class SignalService { mapper.registerSubjectsFidAndDebts(phoneData.getId(), phoneData.getFid(), flagsData.getFlagDebt5000(), flagsData.getFlag90days(), packageId); }); + return fidsPhoneDataList; } public void rejectPackage(MonitoringRequest request) { mapper.insertPackage(request, LocalDateTime.now(), Status.REJECTED.name()); } + public Signals setupMonitoring(MonitoringRequest request, List fids) { + Signals signals = new Signals(); + signals.setOnline("2"); // Всегда=2 (только онлайн-сигналы) + signals.setId(request.getUserId().substring(0, 6) + "_" + request.getPackageName()); // _ + Auth auth = new Auth(); + auth.setUser("test_user"); // TODO from properties // Внутренний логин НБКИ + signals.setAuth(auth); + for (PhoneService.FidsPhoneData fidData : fids) { + Person person = findPerson(fidData.getFid(), fidData.getId()); + if (person != null) { + signals.getConditions().getPersons().getPerson().add(person); + } + } + + return signals; + } + + private Person findPerson(Integer fid, String id) { + PersonService.PersonData personData = personService.findPersonData(fid); + if (personData == null) { + return null; + } + PersonService.NameData nameData = personData.getName(); + PersonService.PassportData passportData = personData.getPassport(); + Person person = new Person(); + person.setS(nameData.getLastName()); + person.setN(nameData.getFirstName()); + person.setM(StringUtils.isNotBlank(nameData.getMiddleName()) ? nameData.getMiddleName() : null); + person.setD(DATE_FORMAT.format(toDate(nameData.getBirthDate()))); + + person.setPn(getPn(passportData.getSerNum(), passportData.getIdNum())); + person.setPd(passportData.getIssDate() != null ? DATE_FORMAT.format(toDate(passportData.getIssDate())) : "01.01.2000"); + person.setDt(StringUtils.isNotBlank(passportData.getIdType2()) ? passportData.getIdType2() : passportData.getIdType()); + person.setIp("0"); + person.setUid(id); + person.setConsentDate(DATE_FORMAT.format(toDate(LocalDate.now()))); + person.setConsentPurpose("16"); + person.setReportUser("АО «НБКИ»"); + person.setLiability("1"); + person.setConsentPeriod("3"); + person.setAgrDate(DATE_FORMAT.format(toDate(LocalDate.now()))); + person.setReportUserRegNum("1057746710713"); + person.setReportUserTaxID("7703548386"); + person.setConsentHash("hash"); + + person.setCs(person.getS()); + person.setConsentN(person.getN()); + person.setConsentM(person.getM()); + person.setConsentBd(person.getD()); + person.setConsentPn(person.getPn()); + person.setConsentPd(person.getPd()); + person.setConsentDt(person.getDt()); + person.setInqPurpose("16"); + return person; + } + + private String getPn(String serNum, String idNum) { + String normSerNum = normalize(serNum); + String normIdNum = normalize(idNum); + return StringUtils.isNotBlank(normSerNum) ? normSerNum + normIdNum : normIdNum; + } + + // TODO move to utility service + private String normalize(String value) { + if (value == null) + return null; + value = value.replaceAll("[^А-Яа-яA-Za-z0-9]", ""); + return value.replaceFirst("^0+", ""); + } + + // TODO move to utility service + private Date toDate(LocalDate date) { + if (date == null) { + return null; + } + return Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()); + } } 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 new file mode 100644 index 0000000..568efde --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java @@ -0,0 +1,127 @@ +package ru.nbch.credit_tracker.service.indic; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import ru.nbch.credit_tracker.mapper.indic.PersonMapper; + +import java.time.LocalDate; +import java.util.Comparator; +import java.util.List; + +@Service +public class PersonService { + + private final PersonMapper mapper; + + public PersonService(PersonMapper mapper) { + this.mapper = mapper; + } + + public PersonData findPersonData(Integer fid) { + NameData person = mapper.findNameData(fid); + PassportData passort = findPassportData(fid); + + if (person != null && passort != null && requiredFieldPresent(person, passort)) { + return new PersonData(person, passort); + } else { + return null; + } + } + + private PassportData findPassportData(Integer fid) { + List passports = mapper.findPassportData(fid); + + List documents = passports.stream().filter(this::isDUL).toList(); // берем только ДУЛ + + if (documents.isEmpty()) { + return null; + } + + // Отдаем приоритет паспортам РФ + PassportData passport = documents.stream() + .filter(p -> "21".equals(p.getIdType2()) || "21".equals(p.getIdType())) + .sorted( + Comparator.comparing( + PassportData::getIssDate, + Comparator.nullsLast(Comparator.reverseOrder()) + ) + ) + .sorted( + Comparator.comparing( + PassportData::getFileSinceDate, + Comparator.nullsLast(Comparator.reverseOrder()) + ) + ).findFirst().orElse(null); + + if (passport != null) { + return passport; + } + + // Если паспорт РФ не найден, смотри остальные ДУЛ'ы и берем первый + passport = documents.stream() + .sorted( + Comparator.comparing( + PassportData::getIssDate, + Comparator.nullsLast(Comparator.reverseOrder()) + ) + ) + .sorted( + Comparator.comparing( + PassportData::getFileSinceDate, + Comparator.nullsLast(Comparator.reverseOrder()) + ) + ).findFirst().orElse(null); + return passport; + } + + private boolean isDUL(PassportData p) { + Integer idType; + Double idType2; + try { + idType = p.getIdType() != null ? Integer.parseInt(p.getIdType()) : null; + } catch (NumberFormatException e) { + idType = null; + } + try { + idType2 = p.getIdType2() != null ? Double.valueOf(p.getIdType2()) : null; + } catch (NumberFormatException e) { + idType2 = null; + } + return (idType != null && idType <= 30) || (idType2 != null && (idType2 >= 1 || idType2 <= 999)); + } + + private boolean requiredFieldPresent(NameData nameData, PassportData passportData) { + boolean isDocTypeNotNull = StringUtils.isNotBlank(passportData.idType) || StringUtils.isNotBlank(passportData.idType2); + return !StringUtils.isAllBlank(nameData.firstName, nameData.lastName, passportData.idNum) && nameData.birthDate != null && isDocTypeNotNull; + } + + @Getter + @AllArgsConstructor + public static class PersonData { + private NameData name; + private PassportData passport; + } + + @Getter + @Setter + public static class NameData { + private String firstName; + private String lastName; + private String middleName; + private LocalDate birthDate; + } + + @Getter + @Setter + public static class PassportData { + private String serNum; + private String idNum; + private LocalDate issDate; + private String idType; + private String idType2; + private LocalDate fileSinceDate; + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java b/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java index c80d6cf..ebe4677 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service; import org.xml.sax.SAXException; import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.response.errors.MonitoringError; +import ru.nbch.credit_tracker.entities.signal_package.Signals; import javax.xml.XMLConstants; import javax.xml.stream.XMLInputFactory; @@ -29,6 +30,7 @@ public class XmlUtilService { // unmarshalling classes MonitoringRequest.class, // marshalling classes + Signals.class, MonitoringError.class); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e1d4918..10b22c5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,4 +25,5 @@ ct.scoring-data-source-settings.password=tester #spring.servlet.multipart.max-request-size=10MB # xsd paths -ct.xsd-validation.monitoring-request-path=monitoring-request.xsd \ No newline at end of file +ct.xsd-validation.monitoring-request-path=monitoring-request.xsd +ct.xsd-validation.signal-package-path=signal-package.xsd \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/indic/PersonMapper.xml b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml new file mode 100644 index 0000000..243c825 --- /dev/null +++ b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file