all queries

This commit is contained in:
Mikhail Trofimov 2025-09-24 15:10:24 +03:00
parent f083716071
commit 4114576a78
3 changed files with 230 additions and 4 deletions

View file

@ -16,4 +16,21 @@ public interface FlagsMapper {
List<FlagsService.FlagFidData> findFlag90ByRuPaymt(@Param("fids") List<Integer> fids, @Param("reportedDate") LocalDate reportedDate);
List<FlagsService.FlagFidData> findFlagsDebt5000Old(@Param("fids") List<Integer> fids);
List<FlagsService.FlagFidData> findFlag90ByPastDueArrearOld(@Param("fids") List<Integer> fids, @Param("reportedDate") LocalDate reportedDate);
List<FlagsService.FlagFidData> findFlag90ByRuPaymtOld(@Param("fids") List<Integer> fids, @Param("reportedDate") LocalDate reportedDate);
List<FlagsService.Debt5000Data> findFlagsDebt5000New(@Param("fids") List<Integer> fids);
List<FlagsService.Debt5000Data> findFlagsDebt5000NewWithOrderBy(@Param("fids") List<Integer> fids);
List<FlagsService.Flag90DaysData> findFlag90ByPastDueArrearNew(@Param("fids") List<Integer> fids, @Param("reportedDate") LocalDate reportedDate);
List<FlagsService.Flag90DaysData> findFlag90ByPastDueArrearNewWithOrderBy(@Param("fids") List<Integer> fids);
List<FlagsService.Flag90DaysData> findFlag90ByRuPaymtNew(@Param("fids") List<Integer> fids, @Param("reportedDate") LocalDate reportedDate);
List<FlagsService.Flag90DaysData> findFlag90ByRuPaymtNewWithOrderBy(@Param("fids") List<Integer> fids);
}

View file

@ -1,9 +1,5 @@
package ru.nbch.credit_tracker.service.indic;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@ -12,6 +8,13 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.mapper.indic.FlagsMapper;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class FlagsService {
@ -29,8 +32,11 @@ public class FlagsService {
List<Integer> distinctFids = fids.stream().distinct().toList();
log.debug("Fids count: {}", distinctFids.size());
Map<Integer, Integer> flags5000 = calcFlag5000(distinctFids);
calcFlag500Test(distinctFids);
Map<Integer, Integer> flags90DaysByPastDueArrear = calcFlag90DaysByPastDueArrear(distinctFids);
calcFlag90DaysByPastDueArrearTest(distinctFids);
Map<Integer, Integer> flags90DaysByRuPaymt = calcFlag90DaysByRuPaymt(distinctFids);
calcFlag90DaysByRuPaymtTest(distinctFids);
Map<Integer, FlagsData> result = new HashMap<>();
fids.forEach(fid -> {
@ -65,6 +71,18 @@ public class FlagsService {
return res;
}
private void calcFlag500Test(List<Integer> fids) {
log.debug("Start findFlagsDebt5000Old");
mapper.findFlagsDebt5000Old(fids);
log.debug("Complete findFlagsDebt5000Old");
log.debug("Start findFlagsDebt5000New");
mapper.findFlagsDebt5000New(fids);
log.debug("Complete findFlagsDebt5000New");
log.debug("Start findFlagsDebt5000NewWithOrderBy");
mapper.findFlagsDebt5000NewWithOrderBy(fids);
log.debug("Complete findFlagsDebt5000NewWithOrderBy");
}
/**
* Флаг = 1, если выполняется хотя бы одно из условий:
* В INDIC.RU_PASTDUEARREAR или RU_PAYMT у данного FID есть запись с DAYS_PAST_DUE 90 и REPORTED_DT >= текущая дата 12 месяцев.
@ -79,6 +97,19 @@ public class FlagsService {
return res;
}
private void calcFlag90DaysByPastDueArrearTest(List<Integer> fids) {
LocalDate yearAgo = LocalDate.now().minusYears(1);
log.debug("Start findFlag90ByPastDueArrearOld");
mapper.findFlag90ByPastDueArrearOld(fids, yearAgo);
log.debug("Complete findFlag90ByPastDueArrearOld");
log.debug("Start findFlag90ByPastDueArrearNew");
mapper.findFlag90ByPastDueArrearNew(fids, yearAgo);
log.debug("Complete findFlag90ByPastDueArrearNew");
log.debug("Start findFlag90ByPastDueArrearNewWithOrderBy");
mapper.findFlag90ByPastDueArrearNewWithOrderBy(fids);
log.debug("Complete findFlag90ByPastDueArrearNewWithOrderBy");
}
private Map<Integer, Integer> calcFlag90DaysByRuPaymt(List<Integer> fids) {
log.debug("Start calculating flag 90 by ruPaymt");
LocalDate yearAgo = LocalDate.now().minusYears(1);
@ -88,6 +119,19 @@ public class FlagsService {
return res;
}
private void calcFlag90DaysByRuPaymtTest(List<Integer> fids) {
LocalDate yearAgo = LocalDate.now().minusYears(1);
log.debug("Start findFlag90ByRuPaymtOld");
mapper.findFlag90ByRuPaymtOld(fids,yearAgo);
log.debug("Complete findFlag90ByRuPaymtOld");
log.debug("Start findFlag90ByRuPaymtNew");
mapper.findFlag90ByRuPaymtNew(fids, yearAgo);
log.debug("Complete findFlag90ByRuPaymtNew");
log.debug("Start findFlag90ByRuPaymtNewWithOrderBy");
mapper.findFlag90ByRuPaymtNewWithOrderBy(fids);
log.debug("Complete findFlag90ByRuPaymtNewWithOrderBy");
}
private Map<Integer, Integer> makeFidFlagMapByRs(List<Integer> fids, List<FlagFidData> rows) {
Map<Integer, Integer> result = new HashMap<>();
for (Integer fid : fids) {
@ -98,6 +142,7 @@ public class FlagsService {
}
return result;
}
@Getter
@Setter
@AllArgsConstructor
@ -112,4 +157,21 @@ public class FlagsService {
private Integer fid;
private Integer flag;
}
@Getter
@Setter
public static class Debt5000Data {
private Integer fid;
private BigInteger accSerialNum;
private LocalDate reportedDate;
private BigDecimal amtPastDue;
}
@Getter
@Setter
public static class Flag90DaysData {
private Integer fid;
private BigInteger daysPastDue;
private LocalDate reportedDate;
}
}

View file

@ -78,4 +78,151 @@
GROUP BY fid
WITH UR
</select>
<select id="findFlagsDebt5000Old" resultMap="FlagsFidDataResultMap">
SELECT rp.FID as fid,
CASE
WHEN EXISTS (SELECT 1
FROM RU_PASTDUEARREAR rp2
WHERE rp2.FID = rp.FID
AND rp2.ACC_SERIAL_NUM = rp.ACC_SERIAL_NUM
AND rp2.REPORTED_DT = rp.MAX_REP_DATE
AND rp2.AMT_PAST_DUE > 5000) THEN 1
ELSE 0
END as flag
FROM (SELECT FID,
ACC_SERIAL_NUM,
MAX(REPORTED_DT) as MAX_REP_DATE
FROM RU_PASTDUEARREAR
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
GROUP BY FID, ACC_SERIAL_NUM) rp
GROUP BY rp.FID, rp.ACC_SERIAL_NUM, rp.MAX_REP_DATE
WITH UR
</select>
<select id="findFlag90ByPastDueArrearOld" resultMap="FlagsFidDataResultMap">
SELECT rp.FID as fid,
CASE
WHEN EXISTS (SELECT 1
FROM RU_PASTDUEARREAR rp2
WHERE rp2.FID = rp.FID
AND rp2.REPORTED_DT >= #{reportedDate}
AND rp2.DAYS_PAST_DUE > 90) THEN 1
ELSE 0
END as flag
FROM (SELECT FID,
DAYS_PAST_DUE
FROM RU_PASTDUEARREAR
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
GROUP BY FID, DAYS_PAST_DUE) rp
GROUP BY rp.FID, rp.DAYS_PAST_DUE
WITH UR
</select>
<select id="findFlag90ByRuPaymtOld" resultMap="FlagsFidDataResultMap">
SELECT rp.FID as fid,
CASE
WHEN EXISTS (SELECT 1
FROM RU_PAYMT rp2
WHERE rp2.FID = rp.FID
AND rp2.REPORTED_DT >= #{reportedDate}
AND rp2.DAYS_PAST_DUE > 90) THEN 1
ELSE 0
END as flag
FROM (SELECT FID,
DAYS_PAST_DUE
FROM RU_PAYMT
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
GROUP BY FID, DAYS_PAST_DUE) rp
GROUP BY rp.FID, rp.DAYS_PAST_DUE
WITH UR
</select>
<resultMap id="Debt500ResultMap" type="ru.nbch.credit_tracker.service.indic.FlagsService$Debt5000Data">
<result property="fid" column="fid" />
<result property="accSerialNum" column="ACC_SERIAL_NUM" />
<result property="reportedDate" column="REPORTED_DT" />
<result property="amtPastDue" column="AMT_PAST_DUE" />
</resultMap>
<select id="findFlagsDebt5000New" resultMap="Debt500ResultMap">
SELECT FID, ACC_SERIAL_NUM, REPORTED_DT, AMT_PAST_DUE
FROM RU_PASTDUEARREAR
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
with UR
</select>
<select id="findFlagsDebt5000NewWithOrderBy" resultMap="Debt500ResultMap">
SELECT FID, ACC_SERIAL_NUM, REPORTED_DT, AMT_PAST_DUE
FROM RU_PASTDUEARREAR
WHERE fid IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
ORDER BY FID, ACC_SERIAL_NUM, REPORTED_DT DESC
with UR
</select>
<resultMap id="Flag90ByPastDueArrearResultMap" type="ru.nbch.credit_tracker.service.indic.FlagsService$Flag90DaysData">
<result property="fid" column="fid" />
<result property="daysPastDue" column="DAYS_PAST_DUE" />
<result property="daysPastDue" column="REPORTED_DT" />
</resultMap>
<select id="findFlag90ByPastDueArrearNew" resultMap="Flag90ByPastDueArrearResultMap">
SELECT FID, DAYS_PAST_DUE
FROM RU_PASTDUEARREAR
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
AND REPORTED_DT >= #{reportedDate}
WITH UR
</select>
<select id="findFlag90ByPastDueArrearNewWithOrderBy">
SELECT FID, DAYS_PAST_DUE, REPORTED_DT
FROM RU_PASTDUEARREAR
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
ORDER BY FID, REPORTED_DT DESC
WITH UR
</select>
<select id="findFlag90ByRuPaymtNew">
SELECT FID, DAYS_PAST_DUE
FROM RU_PAYMT
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
AND REPORTED_DT >= #{reportedDate}
WITH UR
</select>
<select id="findFlag90ByRuPaymtNewWithOrderBy">
SELECT FID, DAYS_PAST_DUE, REPORTED_DT
FROM RU_PAYMT
WHERE FID IN
<foreach item="fid" collection="fids" open="(" separator="," close=")">
#{fid}
</foreach>
ORDER BY FID, REPORTED_DT DESC
WITH UR
</select>
</mapper>