diff --git a/src/main/java/ru/nbch/credit_tracker/entities/indic/PaymentsFlag.java b/src/main/java/ru/nbch/credit_tracker/entities/indic/PaymentsFlag.java new file mode 100644 index 0000000..4668c0a --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/entities/indic/PaymentsFlag.java @@ -0,0 +1,11 @@ +package ru.nbch.credit_tracker.entities.indic; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PaymentsFlag { + private Integer fid; + private Integer flag; +} 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 a3a93be..9b3c013 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -45,7 +45,7 @@ public class SignalService { private final PhoneFidMapService phoneFidMapService; private final PhoneService2 phoneService2; private final PhoneService phoneService; - private final FlagsService2 flagsService; + private final FlagsService flagsService; private final PersonService personService; private final StaxXmlProcessor staxXmlProcessor; @@ -57,7 +57,7 @@ public class SignalService { PhoneFidMapService phoneFidMapService, PhoneService2 phoneService2, PhoneService phoneService, - FlagsService2 flagsService, + FlagsService flagsService, PersonService personService, StaxXmlProcessor staxXmlProcessor) { this.config = config; diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java index 09fbac6..a8e8420 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java @@ -1,11 +1,16 @@ package ru.nbch.credit_tracker.service.indic; +import java.sql.ResultSet; +import java.sql.SQLException; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Service; import ru.nbch.credit_tracker.mapper.indic.FlagsMapper; @@ -13,6 +18,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.LocalDate; import java.util.*; +import ru.nbch.credit_tracker.model.SubjectProfile; @Service public class FlagsService { @@ -20,8 +26,26 @@ public class FlagsService { private static final Logger log = LoggerFactory.getLogger(FlagsService.class); private final FlagsMapper mapper; - public FlagsService(FlagsMapper mapper) { + private static final String SELECT_RU_PASDUEARREAR_DATA = + "SELECT FID, ACC_SERIAL_NUM, REPORTED_DT, AMT_PAST_DUE, DAYS_PAST_DUE " + + "FROM RU_PASTDUEARREAR " + + "WHERE FID IN (:fids) " + + "ORDER BY FID, REPORTED_DT DESC " + + "WITH UR"; + + private static final String SELECT_RU_PAYMT_DATA = + "SELECT FID, DAYS_PAST_DUE, REPORTED_DT " + + "FROM RU_PAYMT " + + "WHERE FID IN (:fids) " + + "AND REPORTED_DT >= :reportedDate " + + "WITH UR"; + + private final NamedParameterJdbcTemplate jdbcTemplate; + + public FlagsService(FlagsMapper mapper, + @Qualifier("jdbcTemplateIndic") NamedParameterJdbcTemplate jdbcTemplate) { this.mapper = mapper; + this.jdbcTemplate = jdbcTemplate; } public Map findFlags(List fids) { @@ -60,6 +84,25 @@ public class FlagsService { return result; } + // TODO optimize + public void fillFlagsData(List subjects) { + List fids = subjects.stream().map(SubjectProfile::getFid).filter(Objects::nonNull).toList(); + Map fidsflagsDataMap = findFlags2(fids); + + fidsflagsDataMap.forEach((fid, data) -> { + subjects.stream().filter(s-> s.getFid() != null && s.getFid().equals(fid)).forEach(phoneFidMap -> { + +// phoneFidMap.setFlagDebt5000(data.getFlagDebt5000()); +// phoneFidMap.setFlag90days(data.getFlag90days()); +// phoneFidMap.setCalculatedAt(LocalDateTime.now()); + }); + }); + + subjects.stream().filter(s-> s.getFid() == null).forEach(phoneFidMap -> { +// phoneFidMap.setCalculatedAt(LocalDateTime.now()); + }); + } + /** * Выбирает данные из RU_PASTDUEARREAR и ищет по ним флаги просрочек * По FID из RU_PASTDUEARREAR выбираются все уникальные ACC_SERIAL_NUM с максимальной датой REPORTED_DT. @@ -175,6 +218,220 @@ public class FlagsService { log.debug("Complete calculating flag 90 days by RU_PAPAYMT"); } + public Map findFlags2(List fids) { + if (fids.isEmpty()) { + return new HashMap<>(); + } + List distinctFids = fids.stream() + .distinct() + .sorted(Comparator.naturalOrder()) + .toList(); + + log.debug("Fids count: {}", distinctFids.size()); + Map flags5000 = new HashMap<>(); + Map flags90DaysByPastDueArrear = new HashMap<>(); + Map flags90DaysByRuPaymt = new HashMap<>(); + findFlagsRuPastDueArrear2(distinctFids, flags5000, flags90DaysByPastDueArrear); + findFlagsRuPaymt2(distinctFids, flags90DaysByRuPaymt); + + Map result = new HashMap<>(); + fids.forEach(fid -> { + Integer flagDebt5000 = flags5000.get(fid); + if (flagDebt5000 == null) { + flagDebt5000 = 0; + } + + Integer flag90days = flags90DaysByPastDueArrear.get(fid); + if (flag90days == null || flag90days == 0) { + flag90days = flags90DaysByRuPaymt.get(fid); + if (flag90days == null) { + flag90days = 0; + } + } + result.put(fid, new FlagsService.FlagsData(flagDebt5000, flag90days)); + }); + + return result; + } + + /** + * Выбирает данные из RU_PASTDUEARREAR и ищет по ним флаги просрочек + * По FID из RU_PASTDUEARREAR выбираются все уникальные ACC_SERIAL_NUM с максимальной датой REPORTED_DT. + * Если по хотя бы одной такой записи AMT_PAST_DUE > 5000, то flag500 устанавливается в 1. + * Если ни по одному счёту условие не выполняется или счетов вообще не найдено, флаг = 0. + *

+ * flag90Days = 1, если выполняется хотя бы одно из условий: + * В INDIC.RU_PASTDUEARREAR у данного FID есть запись с DAYS_PAST_DUE ≥ 90 и REPORTED_DT >= текущая дата – 12 месяцев. + * Если ни по одной записи условия не выполняются или записей вообще не найдено, флаг = 0. + * + * @param fids - отсортирован по возрастанию фидов + * @param flag5000Map - рещультирующая мапа флагов просрочек debt5000 + * @param flag90Days - рещультирующая мапа флагов просрочек 90_days + */ + private void findFlagsRuPastDueArrear2(List fids, Map flag5000Map, Map flag90Days) { + log.debug("Start calculating flag 5000 and 90 days by RU_PASTDUEARREAR"); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("fids", fids); + + jdbcTemplate.query(SELECT_RU_PASDUEARREAR_DATA, params, (ResultSet rs) -> { + Integer currentFid = null; + BigInteger prevAccSerialNum = null; + boolean processed5000ForCurrentId = false; + boolean processed90DaysForCurrentId = false; + LocalDate yearAgo = LocalDate.now().minusYears(1); + + while (rs.next()) { + Integer fid = rs.getInt("FID"); + + // Переход к новому fid. Сброс состояния + if (!fid.equals(currentFid)) { + currentFid = fid; + prevAccSerialNum = null; + processed5000ForCurrentId = false; + processed90DaysForCurrentId = false; + + // Инициализируем значения по умолчанию + flag5000Map.putIfAbsent(fid, 0); + flag90Days.putIfAbsent(fid, 0); + } + + // Если для текущего FID уже обработали оба флага, пропускаем остальные записи + if (processed5000ForCurrentId && processed90DaysForCurrentId) { + continue; + } + + // Обработка флага 5000 + if (!processed5000ForCurrentId && flag5000Map.get(fid) == 0) { + BigInteger currentAccSerialNum = getBigInteger(rs, "ACC_SERIAL_NUM"); + BigDecimal amtPastDue = getBigDecimal(rs, "AMT_PAST_DUE"); + + if (prevAccSerialNum == null || !prevAccSerialNum.equals(currentAccSerialNum)) { + if (amtPastDue != null && amtPastDue.compareTo(BigDecimal.valueOf(5000)) >= 0) { + flag5000Map.put(fid, 1); + processed5000ForCurrentId = true; + } + prevAccSerialNum = currentAccSerialNum; + } + } + + // Обработка флага 90 дней + if (!processed90DaysForCurrentId) { + Integer currentFlag90 = flag90Days.get(fid); + + if (currentFlag90 != null && currentFlag90 == 1) { + processed90DaysForCurrentId = true; + continue; + } + + if (currentFlag90 == null || currentFlag90 == 0) { + BigInteger days = getBigInteger(rs, "DAYS_PAST_DUE"); + LocalDate reportedDate = rs.getObject("REPORTED_DT", LocalDate.class); + + if (days != null) { + boolean has90daysFlag = days.compareTo(BigInteger.valueOf(90)) >= 0 + && reportedDate != null && !reportedDate.isBefore(yearAgo); + + if (has90daysFlag) { + flag90Days.put(fid, 1); + processed90DaysForCurrentId = true; + } else { + flag90Days.put(fid, 0); + } + } else { + flag90Days.put(fid, 0); + } + } + } + } + return null; + }); + log.debug("Complete calculating flag 5000 and 90 days by RU_PASTDUEARREAR"); + } + + /** + * Выбирает данные из RU_PAYMT и ищет по ним флаги просрочек 90Days + *

+ * flag90Days = 1, если выполняется хотя бы одно из условий: + * В INDIC.RU_PAYMT у данного FID есть запись с DAYS_PAST_DUE ≥ 90 и REPORTED_DT >= текущая дата – 12 месяцев. + * Если ни по одной записи условия не выполняются или записей вообще не найдено, флаг = 0. + * + * @param fids - отсортирован по возрастанию фидов + * @param flag90Days - рещультирующая мапа флагов просрочек 90_days + */ + private void findFlagsRuPaymt2(List fids, Map flag90Days) { + log.debug("Start calculating flag 90 days by RU_PAPAYMT"); + LocalDate yearAgo = LocalDate.now().minusYears(1); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("fids", fids); + params.addValue("reportedDate", yearAgo); + jdbcTemplate.query(SELECT_RU_PAYMT_DATA, params, rs -> { + Integer currentFid = null; + boolean processed90DaysForCurrentId = false; + + while (rs.next()) { + Integer fid = rs.getInt("FID"); + + // Переход к новому fid. Сброс состояния + if (!fid.equals(currentFid)) { + currentFid = fid; + processed90DaysForCurrentId = false; + + // Инициализируем значения по умолчанию + flag90Days.putIfAbsent(fid, 0); + } + + // Обработка флага 90 дней + if (!processed90DaysForCurrentId) { + Integer currentFlag90 = flag90Days.get(fid); + + if (currentFlag90 != null && currentFlag90 == 1) { + processed90DaysForCurrentId = true; + continue; + } + + if (currentFlag90 == null || currentFlag90 == 0) { + BigInteger days = getBigInteger(rs, "DAYS_PAST_DUE"); + LocalDate date = rs.getObject("REPORTED_DT", LocalDate.class); + + if (days != null) { + boolean has90daysFlag = days.compareTo(BigInteger.valueOf(90)) >= 0 + && date != null && !date.isBefore(yearAgo); + + if (has90daysFlag) { + flag90Days.put(fid, 1); + processed90DaysForCurrentId = true; + } else { + flag90Days.put(fid, 0); + } + } else { + flag90Days.put(fid, 0); + } + } + } + } + return null; + }); + log.debug("Complete calculating flag 90 days by RU_PAPAYMT"); + } + + + private BigInteger getBigInteger(ResultSet rs, String columnName) { + try { + String value = rs.getString(columnName); + return value != null ? new BigInteger(value) : null; + } catch (SQLException e) { + return null; + } + } + + private BigDecimal getBigDecimal(ResultSet rs, String columnName) { + try { + return rs.getBigDecimal(columnName); + } catch (SQLException e) { + return null; + } + } + @Getter @Setter @AllArgsConstructor diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java index 972b5a8..ee04459 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService2.java @@ -20,256 +20,12 @@ import ru.nbch.credit_tracker.model.SubjectProfile; @Service public class FlagsService2 { - private static final String SELECT_RU_PASDUEARREAR_DATA = - "SELECT FID, ACC_SERIAL_NUM, REPORTED_DT, AMT_PAST_DUE, DAYS_PAST_DUE " + - "FROM RU_PASTDUEARREAR " + - "WHERE FID IN (:fids) " + - "ORDER BY FID, REPORTED_DT DESC " + - "WITH UR"; + public FlagsService2() { - private static final String SELECT_RU_PAYMT_DATA = - "SELECT FID, DAYS_PAST_DUE, REPORTED_DT " + - "FROM RU_PAYMT " + - "WHERE FID IN (:fids) " + - "AND REPORTED_DT >= :reportedDate " + - "WITH UR"; - - private final NamedParameterJdbcTemplate jdbcTemplate; - - public FlagsService2(@Qualifier("jdbcTemplateIndic") NamedParameterJdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; } // TODO optimize - public void fillFlagsData(List subjects) { - List fids = subjects.stream().map(SubjectProfile::getFid).filter(Objects::nonNull).toList(); - Map fidsflagsDataMap = findFlags(fids); - - fidsflagsDataMap.forEach((fid, data) -> { - subjects.stream().filter(s-> s.getFid() != null && s.getFid().equals(fid)).forEach(phoneFidMap -> { - -// phoneFidMap.setFlagDebt5000(data.getFlagDebt5000()); -// phoneFidMap.setFlag90days(data.getFlag90days()); -// phoneFidMap.setCalculatedAt(LocalDateTime.now()); - }); - }); - - subjects.stream().filter(s-> s.getFid() == null).forEach(phoneFidMap -> { -// phoneFidMap.setCalculatedAt(LocalDateTime.now()); - }); - } - - public Map findFlags(List fids) { - if (fids.isEmpty()) { - return new HashMap<>(); - } - List distinctFids = fids.stream() - .distinct() - .sorted(Comparator.naturalOrder()) - .toList(); - - log.debug("Fids count: {}", distinctFids.size()); - Map flags5000 = new HashMap<>(); - Map flags90DaysByPastDueArrear = new HashMap<>(); - Map flags90DaysByRuPaymt = new HashMap<>(); - findFlagsRuPastDueArrear(distinctFids, flags5000, flags90DaysByPastDueArrear); - findFlagsRuPaymt(distinctFids, flags90DaysByRuPaymt); - - Map result = new HashMap<>(); - fids.forEach(fid -> { - Integer flagDebt5000 = flags5000.get(fid); - if (flagDebt5000 == null) { - flagDebt5000 = 0; - } - - Integer flag90days = flags90DaysByPastDueArrear.get(fid); - if (flag90days == null || flag90days == 0) { - flag90days = flags90DaysByRuPaymt.get(fid); - if (flag90days == null) { - flag90days = 0; - } - } - result.put(fid, new FlagsService.FlagsData(flagDebt5000, flag90days)); - }); - - return result; - } - - /** - * Выбирает данные из RU_PASTDUEARREAR и ищет по ним флаги просрочек - * По FID из RU_PASTDUEARREAR выбираются все уникальные ACC_SERIAL_NUM с максимальной датой REPORTED_DT. - * Если по хотя бы одной такой записи AMT_PAST_DUE > 5000, то flag500 устанавливается в 1. - * Если ни по одному счёту условие не выполняется или счетов вообще не найдено, флаг = 0. - *

- * flag90Days = 1, если выполняется хотя бы одно из условий: - * В INDIC.RU_PASTDUEARREAR у данного FID есть запись с DAYS_PAST_DUE ≥ 90 и REPORTED_DT >= текущая дата – 12 месяцев. - * Если ни по одной записи условия не выполняются или записей вообще не найдено, флаг = 0. - * - * @param fids - отсортирован по возрастанию фидов - * @param flag5000Map - рещультирующая мапа флагов просрочек debt5000 - * @param flag90Days - рещультирующая мапа флагов просрочек 90_days - */ - private void findFlagsRuPastDueArrear(List fids, Map flag5000Map, Map flag90Days) { - log.debug("Start calculating flag 5000 and 90 days by RU_PASTDUEARREAR"); - MapSqlParameterSource params = new MapSqlParameterSource(); - params.addValue("fids", fids); - - jdbcTemplate.query(SELECT_RU_PASDUEARREAR_DATA, params, (ResultSet rs) -> { - Integer currentFid = null; - BigInteger prevAccSerialNum = null; - boolean processed5000ForCurrentId = false; - boolean processed90DaysForCurrentId = false; - LocalDate yearAgo = LocalDate.now().minusYears(1); - - while (rs.next()) { - Integer fid = rs.getInt("FID"); - - // Переход к новому fid. Сброс состояния - if (!fid.equals(currentFid)) { - currentFid = fid; - prevAccSerialNum = null; - processed5000ForCurrentId = false; - processed90DaysForCurrentId = false; - - // Инициализируем значения по умолчанию - flag5000Map.putIfAbsent(fid, 0); - flag90Days.putIfAbsent(fid, 0); - } - - // Если для текущего FID уже обработали оба флага, пропускаем остальные записи - if (processed5000ForCurrentId && processed90DaysForCurrentId) { - continue; - } - - // Обработка флага 5000 - if (!processed5000ForCurrentId && flag5000Map.get(fid) == 0) { - BigInteger currentAccSerialNum = getBigInteger(rs, "ACC_SERIAL_NUM"); - BigDecimal amtPastDue = getBigDecimal(rs, "AMT_PAST_DUE"); - - if (prevAccSerialNum == null || !prevAccSerialNum.equals(currentAccSerialNum)) { - if (amtPastDue != null && amtPastDue.compareTo(BigDecimal.valueOf(5000)) >= 0) { - flag5000Map.put(fid, 1); - processed5000ForCurrentId = true; - } - prevAccSerialNum = currentAccSerialNum; - } - } - - // Обработка флага 90 дней - if (!processed90DaysForCurrentId) { - Integer currentFlag90 = flag90Days.get(fid); - - if (currentFlag90 != null && currentFlag90 == 1) { - processed90DaysForCurrentId = true; - continue; - } - - if (currentFlag90 == null || currentFlag90 == 0) { - BigInteger days = getBigInteger(rs, "DAYS_PAST_DUE"); - LocalDate reportedDate = rs.getObject("REPORTED_DT", LocalDate.class); - - if (days != null) { - boolean has90daysFlag = days.compareTo(BigInteger.valueOf(90)) >= 0 - && reportedDate != null && !reportedDate.isBefore(yearAgo); - - if (has90daysFlag) { - flag90Days.put(fid, 1); - processed90DaysForCurrentId = true; - } else { - flag90Days.put(fid, 0); - } - } else { - flag90Days.put(fid, 0); - } - } - } - } - return null; - }); - log.debug("Complete calculating flag 5000 and 90 days by RU_PASTDUEARREAR"); - } - - /** - * Выбирает данные из RU_PAYMT и ищет по ним флаги просрочек 90Days - *

- * flag90Days = 1, если выполняется хотя бы одно из условий: - * В INDIC.RU_PAYMT у данного FID есть запись с DAYS_PAST_DUE ≥ 90 и REPORTED_DT >= текущая дата – 12 месяцев. - * Если ни по одной записи условия не выполняются или записей вообще не найдено, флаг = 0. - * - * @param fids - отсортирован по возрастанию фидов - * @param flag90Days - рещультирующая мапа флагов просрочек 90_days - */ - private void findFlagsRuPaymt(List fids, Map flag90Days) { - log.debug("Start calculating flag 90 days by RU_PAPAYMT"); - LocalDate yearAgo = LocalDate.now().minusYears(1); - MapSqlParameterSource params = new MapSqlParameterSource(); - params.addValue("fids", fids); - params.addValue("reportedDate", yearAgo); - jdbcTemplate.query(SELECT_RU_PAYMT_DATA, params, rs -> { - Integer currentFid = null; - boolean processed90DaysForCurrentId = false; - - while (rs.next()) { - Integer fid = rs.getInt("FID"); - - // Переход к новому fid. Сброс состояния - if (!fid.equals(currentFid)) { - currentFid = fid; - processed90DaysForCurrentId = false; - - // Инициализируем значения по умолчанию - flag90Days.putIfAbsent(fid, 0); - } - - // Обработка флага 90 дней - if (!processed90DaysForCurrentId) { - Integer currentFlag90 = flag90Days.get(fid); - - if (currentFlag90 != null && currentFlag90 == 1) { - processed90DaysForCurrentId = true; - continue; - } - - if (currentFlag90 == null || currentFlag90 == 0) { - BigInteger days = getBigInteger(rs, "DAYS_PAST_DUE"); - LocalDate date = rs.getObject("REPORTED_DT", LocalDate.class); - - if (days != null) { - boolean has90daysFlag = days.compareTo(BigInteger.valueOf(90)) >= 0 - && date != null && !date.isBefore(yearAgo); - - if (has90daysFlag) { - flag90Days.put(fid, 1); - processed90DaysForCurrentId = true; - } else { - flag90Days.put(fid, 0); - } - } else { - flag90Days.put(fid, 0); - } - } - } - } - return null; - }); - log.debug("Complete calculating flag 90 days by RU_PAPAYMT"); - } - private BigInteger getBigInteger(ResultSet rs, String columnName) { - try { - String value = rs.getString(columnName); - return value != null ? new BigInteger(value) : null; - } catch (SQLException e) { - return null; - } - } - private BigDecimal getBigDecimal(ResultSet rs, String columnName) { - try { - return rs.getBigDecimal(columnName); - } catch (SQLException e) { - return null; - } - } } diff --git a/src/main/java/ru/nbch/credit_tracker/service/task/impl/FlagsEnricher.java b/src/main/java/ru/nbch/credit_tracker/service/task/impl/FlagsEnricher.java index dd95a58..da941d8 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/task/impl/FlagsEnricher.java +++ b/src/main/java/ru/nbch/credit_tracker/service/task/impl/FlagsEnricher.java @@ -11,6 +11,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.exception.ExceptionUtils; +import ru.nbch.credit_tracker.entities.app.PhoneFidMap; import ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper; import ru.nbch.credit_tracker.model.SubjectProfile; import ru.nbch.credit_tracker.model.impl.SubjectPayload; @@ -20,15 +21,15 @@ import ru.nbch.credit_tracker.service.indic.FlagsService2; public class FlagsEnricher implements Runnable { private final FlagsService2 flagsService; - private final PhoneFidMapMapper mapper; + private final PhoneFidMapMapper phoneFidMapMapper; private BlockingQueue in; private final CompletableFuture done = new CompletableFuture<>(); private final ExecutorService ioPool; public FlagsEnricher(FlagsService2 flagsService, - PhoneFidMapMapper mapper) { + PhoneFidMapMapper phoneFidMapMapper) { this.flagsService = flagsService; - this.mapper = mapper; + this.phoneFidMapMapper = phoneFidMapMapper; this.ioPool = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MINUTES, @@ -69,21 +70,19 @@ public class FlagsEnricher implements Runnable { } public void process(SubjectPayload subjectPayload) { - List phoneFidMaps = subjectPayload.getSubjects(); - log.debug("FlagsEnricher handle by packageId: {}, size: {}", subjectPayload.getPackageId(), phoneFidMaps.size()); - flagsService.fillFlagsData(phoneFidMaps); + List subjects = subjectPayload.getSubjects(); + log.debug("FlagsEnricher handle by packageId: {}, size: {}", subjectPayload.getPackageId(), subjects.size()); +// flagsService.fillFlagsData(subjects); - //todo по какому ключу апдейтить записи, потому что id у нас тут нет, по subject_id? или все же сохранять id при вставке в SaveSubjectHandler -// log.debug("Start updating subject's batch"); -// if (!phoneFidMaps.isEmpty()) { -// int updateBatchSize = 7000; -// for (int j = 0; j < phoneFidMaps.size(); j += updateBatchSize) { -// int endIndex = Math.min(j + updateBatchSize, phoneFidMaps.size()); -// mapper.updatePhoneFidMaps(phoneFidMaps.subList(j, endIndex)); -// log.trace("Updated fids and flags for subject's batch from: {} to: {}. Total count: {}. PackageId: {}", j, endIndex, phoneFidMaps.size(), taskPayload.getPackageId()); -// } -// } -// log.debug("Complete updating subject's batch"); + List phoneFidMaps = subjects.stream().map(subject -> { + return PhoneFidMap.builder() + .phone(subject.getPhone()) + .subjectId(subject.getIdentifier()) + .packageId(subjectPayload.getPackageId()) + .fid(subject.getFid()) + .build(); + }).toList(); + phoneFidMapMapper.register(phoneFidMaps); } public void setPollingQueue(BlockingQueue queue) { diff --git a/src/main/java/ru/nbch/credit_tracker/service/task/impl/SaveSubjectHandler.java b/src/main/java/ru/nbch/credit_tracker/service/task/impl/SaveSubjectHandler.java index f1d38af..5bc45ed 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/task/impl/SaveSubjectHandler.java +++ b/src/main/java/ru/nbch/credit_tracker/service/task/impl/SaveSubjectHandler.java @@ -2,10 +2,8 @@ package ru.nbch.credit_tracker.service.task.impl; import java.util.List; import java.util.Map; -import java.util.Optional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.nbch.credit_tracker.entities.app.PhoneFidMap; import ru.nbch.credit_tracker.entities.indic.Name; import ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper; import ru.nbch.credit_tracker.model.NameData; @@ -40,37 +38,21 @@ public class SaveSubjectHandler implements Handler nameByPhone = phoneService2.findNameByNumber(subjects); //todo сделать один проход для установки FID для вставки в PHONE_FID_MAP и одновременного заполнения инфо из Name для дальнейшей обработки - List phoneFidMaps = subjects.stream() - .filter(subject -> nameByPhone.containsKey(CTUtil.normalizePhoneNumber(subject.getPhone()))) - .map(subject -> { - //заполним инфо из NAME для след. обработчика - { - Name name = nameByPhone.get(CTUtil.normalizePhoneNumber(subject.getPhone())); - NameData nameData = NameData.builder() - .middleName(name.getMiddle()) - .firstName(name.getFirst()) - .lastName(name.getLast()) - .fileSinceDate(name.getFileSinceDate()) - .birthDate(name.getBirthDate()) - .build(); - - subject.setFid(name.getFid()); - subject.setNameData(nameData); - } - - Integer fid = Optional - .ofNullable(nameByPhone.get(CTUtil.normalizePhoneNumber(subject.getPhone()))) - .map(Name::getFid) - .orElse(null); - - return PhoneFidMap.builder() - .phone(subject.getPhone()) - .subjectId(subject.getIdentifier()) - .packageId(packageId) - .fid(fid) + subjects.forEach(subject -> { + Name name = nameByPhone.get(CTUtil.normalizePhoneNumber(subject.getPhone())); + if (name != null) { + NameData nameData = NameData.builder() + .middleName(name.getMiddle()) + .firstName(name.getFirst()) + .lastName(name.getLast()) + .fileSinceDate(name.getFileSinceDate()) + .birthDate(name.getBirthDate()) .build(); - }).toList(); - phoneFidMapMapper.register(phoneFidMaps); + + subject.setFid(name.getFid()); + subject.setNameData(nameData); + } + }); //todo стоит ли делать имутабл для subject? return new SubjectPayload(taskPayload.getPackageId(), subjects); } diff --git a/src/main/resources/mybatis/mapper/indic/FlagsMapper.xml b/src/main/resources/mybatis/mapper/indic/FlagsMapper.xml index a186744..e4c401e 100644 --- a/src/main/resources/mybatis/mapper/indic/FlagsMapper.xml +++ b/src/main/resources/mybatis/mapper/indic/FlagsMapper.xml @@ -19,6 +19,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/ru/nbch/credit_tracker/service/FlagsService2Test.java b/src/test/java/ru/nbch/credit_tracker/service/FlagsService2Test.java index 77bce91..06ad33f 100644 --- a/src/test/java/ru/nbch/credit_tracker/service/FlagsService2Test.java +++ b/src/test/java/ru/nbch/credit_tracker/service/FlagsService2Test.java @@ -1,20 +1,18 @@ package ru.nbch.credit_tracker.service; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import ru.nbch.credit_tracker.service.indic.FlagsService; -import ru.nbch.credit_tracker.service.indic.FlagsService2; - -import javax.sql.DataSource; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Map; +import javax.sql.DataSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import ru.nbch.credit_tracker.service.indic.FlagsService; public class FlagsService2Test { @@ -127,7 +125,7 @@ public class FlagsService2Test { private DataSource dataSource; private NamedParameterJdbcTemplate jdbcTemplate; - private FlagsService2 flagsService; + private FlagsService flagsService; @BeforeEach void setUp() { @@ -146,7 +144,7 @@ public class FlagsService2Test { jdbcTemplate.getJdbcTemplate().execute(RU_PASTDUEAREAR_CREATE); jdbcTemplate.getJdbcTemplate().execute(RU_PAYMT_CREATE); - flagsService = new FlagsService2(jdbcTemplate); + flagsService = new FlagsService(null, jdbcTemplate); } @Test diff --git a/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java b/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java index 2284db9..944e8c1 100644 --- a/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java +++ b/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java @@ -30,7 +30,7 @@ public class FlagsServiceTest { @Test public void testfindFlags() { - FlagsService flagsService = new FlagsService(flagsMapper); + FlagsService flagsService = new FlagsService(flagsMapper, null); when(flagsMapper.findRuPastDuarearData(Mockito.anyList())).thenReturn(ruPastDuarearDataList); when(flagsMapper.findRuPaymtData(Mockito.anyList(), Mockito.any())).thenReturn(ruPaymtDataList); @@ -73,7 +73,7 @@ public class FlagsServiceTest { @Test public void testfindFlagsWithoutRuPaymt() { - FlagsService flagsService = new FlagsService(flagsMapper); + FlagsService flagsService = new FlagsService(flagsMapper, null); when(flagsMapper.findRuPastDuarearData(Mockito.anyList())).thenReturn(ruPastDuarearDataList); when(flagsMapper.findRuPaymtData(Mockito.anyList(), Mockito.any())).thenReturn(new ArrayList<>()); @@ -117,7 +117,7 @@ public class FlagsServiceTest { @Test public void testfindFlagsWithoutRuPastduearreae() { - FlagsService flagsService = new FlagsService(flagsMapper); + FlagsService flagsService = new FlagsService(flagsMapper, null); when(flagsMapper.findRuPastDuarearData(Mockito.anyList())).thenReturn(new ArrayList<>()); when(flagsMapper.findRuPaymtData(Mockito.anyList(), Mockito.any())).thenReturn(ruPaymtDataList);