Split signal mappers by tables

This commit is contained in:
Mikhail Trofimov 2025-07-01 18:10:58 +03:00
parent 392b99aca4
commit b80ec82ab9
10 changed files with 270 additions and 106 deletions

View file

@ -0,0 +1,14 @@
package ru.nbch.credit_tracker.mapper.signal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import ru.nbch.credit_tracker.entities.dto.HitsData;
import java.util.List;
@Mapper
public interface HitsMapper {
void setHits(@Param("hits") List<HitsData> hits);
}

View file

@ -0,0 +1,24 @@
package ru.nbch.credit_tracker.mapper.signal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import ru.nbch.credit_tracker.entities.dto.SubjectData;
import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject;
import java.time.LocalDateTime;
import java.util.List;
@Mapper
public interface PhoneFidMapMapper {
void registerSubjects(@Param("subjects") List<Subject> subjects, @Param("packageId") Integer packageId);
void registerSubjectsFidAndDebts(@Param("id") Integer id, @Param("fid") Integer fid, @Param("flagDebt5000") Integer flagDebt5000, @Param("flag90") Integer flag90, @Param("calculatedAt") LocalDateTime calculatedAt);
List<SubjectData> findSubjectsData(@Param("packageId") Integer packageId);
List<SubjectData> findFullSubjectsData(@Param("packageId") Integer packageId);
void updateSubjects(@Param("subjects") List<SubjectData> subjects);
}

View file

@ -2,17 +2,14 @@ package ru.nbch.credit_tracker.mapper.signal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import ru.nbch.credit_tracker.entities.dto.HitsData;
import ru.nbch.credit_tracker.entities.dto.PackageData;
import ru.nbch.credit_tracker.entities.dto.SubjectData;
import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject;
import java.time.LocalDateTime;
import java.util.List;
@Mapper
public interface SignalMapper {
public interface UserPackageMapper {
boolean isPackageNotUnique(@Param("userId") String userId, @Param("packageName") String packageName);
@ -20,19 +17,11 @@ public interface SignalMapper {
void deletePackage(@Param("userId") String userId, @Param("packageName") String packageName, @Param("status") String newStatus, @Param("previousStatus") String previousStatus, @Param("deactivatedAt") LocalDateTime deactivatedAt);
Integer registerPackage(@Param("request") MonitoringRequest request, @Param("creadedAt") LocalDateTime creadedAt, @Param("status") String status);
void registerSubjects(@Param("subjects") List<Subject> subjects, @Param("packageId") Integer packageId);
void insertPackage(@Param("request") MonitoringRequest request, @Param("creadedAt") LocalDateTime creadedAt, @Param("status") String status);
void registerSubjectsFidAndDebts(@Param("id") Integer id, @Param("fid") Integer fid, @Param("flagDebt5000") Integer flagDebt5000, @Param("flag90") Integer flag90, @Param("calculatedAt") LocalDateTime calculatedAt);
Integer insertPackage(@Param("request") MonitoringRequest request, @Param("creadedAt") LocalDateTime creadedAt, @Param("status") String status);
void setPackageStatus(@Param("packageId") Integer packageId, @Param("status") String status);
List<SubjectData> findSubjectsData(@Param("packageId") Integer packageId);
List<SubjectData> findFullSubjectsData(@Param("packageId") Integer packageId);
void setPackageLastDownloadedReport(@Param("id") Integer id, @Param("fileName") String fileName);
PackageData findPackageData(@Param("id") Integer id);
@ -40,9 +29,4 @@ public interface SignalMapper {
List<PackageData> findPackagesByStatus(@Param("status") String status);
void setHits(@Param("hits") List<HitsData> hits);
void updateSubjects(@Param("subjects") List<SubjectData> subjects);
void setPackageLastDownloadedReport(@Param("id") Integer id, @Param("fileName") String fileName);
}

View file

@ -17,10 +17,12 @@ 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 ru.nbch.credit_tracker.service.signal.HitsService;
import ru.nbch.credit_tracker.service.signal.PhoneFidMapService;
import ru.nbch.credit_tracker.service.signal.UserPackageService;
import ru.nbch.credit_tracker.utils.CTUtil;
import java.text.DateFormat;
@ -39,7 +41,9 @@ public class SignalService {
private final static DateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy");
private final CreditTrackerSettings config;
private final SignalMapper mapper;
private final HitsService hitsService;
private final UserPackageService userPackageService;
private final PhoneFidMapService phoneFidMapService;
private final PhoneService phoneService;
private final FlagsService flagsService;
private final PersonService personService;
@ -47,12 +51,16 @@ public class SignalService {
private final int batchSize = 10000;
public SignalService(CreditTrackerSettings config,
SignalMapper mapper,
HitsService hitsService,
UserPackageService userPackageService,
PhoneFidMapService phoneFidMapService,
PhoneService phoneService,
FlagsService flagsService,
PersonService personService) {
this.config = config;
this.mapper = mapper;
this.hitsService = hitsService;
this.userPackageService = userPackageService;
this.phoneFidMapService = phoneFidMapService;
this.phoneService = phoneService;
this.flagsService = flagsService;
this.personService = personService;
@ -60,21 +68,21 @@ public class SignalService {
public boolean isPackageNotUnique(MonitoringRequest request) {
String userId = request.getUserId();
return mapper.isPackageNotUnique(userId.substring(0, 6), request.getPackageName());
return userPackageService.isPackageNotUnique(userId.substring(0, 6), request.getPackageName());
}
public Integer registerPackage(MonitoringRequest request) {
Integer packageId = mapper.registerPackage(request, LocalDateTime.now(), Status.PROCESSING.name());
Integer packageId = userPackageService.insertPackage(request, LocalDateTime.now(), Status.PROCESSING);
List<Subject> subjects = request.getSubjects().getSubject();
for (int i = 0; i < subjects.size(); i += batchSize) {
int end = Math.min(i + batchSize, subjects.size());
mapper.registerSubjects(subjects.subList(i, end), packageId);
phoneFidMapService.registerSubjects(subjects.subList(i, end), packageId);
}
return packageId;
}
public List<PhoneService.FidsPhoneData> registerSubjectsFidAndDebts(Integer packageId) {
List<SubjectData> subjects = mapper.findSubjectsData(packageId);
List<SubjectData> subjects = phoneFidMapService.findSubjectsData(packageId);
return updateFlags(subjects, packageId);
}
@ -101,7 +109,7 @@ public class SignalService {
int updateBatchSize = batchSize / 8; // 8 параметров на одну запись для обновления. Максимальное количество параметров ~65000
for (int j = 0; j < subjectToUpdate.size(); j += updateBatchSize) {
int endIndex = Math.min(j + updateBatchSize, subjectToUpdate.size());
mapper.updateSubjects(subjectToUpdate.subList(j, endIndex));
phoneFidMapService.updateSubjects(subjectToUpdate.subList(j, endIndex));
}
}
@ -109,15 +117,15 @@ public class SignalService {
}
public void rejectPackage(MonitoringRequest request) {
mapper.insertPackage(request, LocalDateTime.now(), Status.REJECTED.name());
userPackageService.insertPackage(request, LocalDateTime.now(), Status.REJECTED);
}
public void setPackageStatus(Integer packageId, Status status) {
mapper.setPackageStatus(packageId, status.name());
userPackageService.setPackageStatus(packageId, status);
}
public Signals buildSignals(Integer packageId, List<PhoneService.FidsPhoneData> fids) {
PackageData packageData = mapper.findPackageData(packageId);
PackageData packageData = userPackageService.findPackageData(packageId);
Signals signals = new Signals();
signals.setOnline("2"); // Всегда=2 (только онлайн-сигналы)
signals.setId(packageData.getUserId().substring(0, 6) + "_" + packageData.getPackageName()); // <MEMBERCODE>_<PackageName>
@ -205,7 +213,7 @@ public class SignalService {
activePackages.setStatus("OK");
activePackages.setMembercode(memberCode);
Packages packages = new Packages();
mapper.findPackageDataList(memberCode, Status.ON_MONITORING.name()).forEach(data -> {
userPackageService.findPackageDataList(memberCode, Status.ON_MONITORING).forEach(data -> {
Package pack = new Package();
pack.setPackageName(data.getPackageName());
pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null);
@ -220,12 +228,12 @@ public class SignalService {
}
public boolean isPackageExists(String username, String packageName) {
return mapper.isPackageExists(username.substring(0, 6), packageName, Status.ON_MONITORING.name());
return userPackageService.isPackageExists(username.substring(0, 6), packageName, Status.ON_MONITORING);
}
public MonitoringPackageDeleteResponse deletePackage(String username, String packageName) {
LocalDateTime deactivatedAt = LocalDateTime.now();
mapper.deletePackage(username.substring(0, 6), packageName, Status.DELETED.name(), Status.ON_MONITORING.name(), deactivatedAt);
userPackageService.deletePackage(username.substring(0, 6), packageName, Status.DELETED, Status.ON_MONITORING, deactivatedAt);
MonitoringPackageDeleteResponse deleteResponse = new MonitoringPackageDeleteResponse();
deleteResponse.setStatus("Deleted");
@ -235,18 +243,18 @@ public class SignalService {
}
public List<PackageData> findPackagesOnMonitoring() {
return mapper.findPackagesByStatus(Status.ON_MONITORING.name());
return userPackageService.findPackagesByStatus(Status.ON_MONITORING);
}
public List<SubjectData> findFullSubjectsData(Integer packageId) {
return mapper.findFullSubjectsData(packageId);
return phoneFidMapService.findFullSubjectsData(packageId);
}
public void setHits(List<HitsData> hits) {
mapper.setHits(hits);
hitsService.setHits(hits);
}
public void updateLastDownloadedReport(Integer id, String fileName) {
mapper.setPackageLastDownloadedReport(id, fileName);
userPackageService.setPackageLastDownloadedReport(id, fileName);
}
}

View file

@ -0,0 +1,21 @@
package ru.nbch.credit_tracker.service.signal;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.dto.HitsData;
import ru.nbch.credit_tracker.mapper.signal.HitsMapper;
import java.util.List;
@Service
public class HitsService {
private final HitsMapper mapper;
public HitsService(HitsMapper mapper) {
this.mapper = mapper;
}
public void setHits(List<HitsData> hits) {
mapper.setHits(hits);
}
}

View file

@ -0,0 +1,39 @@
package ru.nbch.credit_tracker.service.signal;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.dto.SubjectData;
import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject;
import ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class PhoneFidMapService {
private final PhoneFidMapMapper mapper;
public PhoneFidMapService(PhoneFidMapMapper mapper) {
this.mapper = mapper;
}
public void registerSubjects(List<Subject> subjects, Integer packageId) {
mapper.registerSubjects(subjects, packageId);
}
public void registerSubjectsFidAndDebts(Integer id, Integer fid, Integer flagDebt5000, Integer flag90, LocalDateTime calculatedAt) {
mapper.registerSubjectsFidAndDebts(id, fid, flagDebt5000, flag90, calculatedAt);
}
public List<SubjectData> findSubjectsData(Integer packageId) {
return mapper.findSubjectsData(packageId);
}
public List<SubjectData> findFullSubjectsData( Integer packageId) {
return mapper.findFullSubjectsData(packageId);
}
public void updateSubjects(List<SubjectData> subjects) {
mapper.updateSubjects(subjects);
}
}

View file

@ -0,0 +1,56 @@
package ru.nbch.credit_tracker.service.signal;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.dto.PackageData;
import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class UserPackageService {
private final UserPackageMapper mapper;
public UserPackageService(UserPackageMapper mapper) {
this.mapper = mapper;
}
public boolean isPackageNotUnique(String userId, String packageName) {
return mapper.isPackageNotUnique(userId, packageName);
}
public boolean isPackageExists(String userId, String packageName, Status status) {
return mapper.isPackageExists(userId, packageName, status.name());
}
public void deletePackage(String userId, String packageName, Status newStatus, Status previousStatus, LocalDateTime deactivatedAt) {
mapper.deletePackage(userId, packageName, newStatus.name(), previousStatus.name(), deactivatedAt);
}
public Integer insertPackage(MonitoringRequest request, LocalDateTime creadedAt, Status status) {
return mapper.insertPackage(request, creadedAt, status.name());
}
public void setPackageStatus(Integer packageId, Status status) {
mapper.setPackageStatus(packageId, status.name());
}
public void setPackageLastDownloadedReport(Integer id, String fileName) {
mapper.setPackageLastDownloadedReport(id, fileName);
}
public PackageData findPackageData(Integer id) {
return mapper.findPackageData(id);
}
public List<PackageData> findPackageDataList(String userId, Status status) {
return mapper.findPackageDataList(userId, status.name());
}
public List<PackageData> findPackagesByStatus(Status status) {
return mapper.findPackagesByStatus(status.name());
}
}

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.HitsMapper">
<insert id="setHits" parameterType="java.util.List">
INSERT INTO signals_hits (package_id, subject_id, signal_type, response_sent_at, report_file_name)
values
<foreach collection="hits" item="hit" separator=",">
(#{hit.packageId}, #{hit.subjectId}, #{hit.signalType}, #{hit.responseSentAt}, #{hit.reportFileName})
</foreach>
</insert>
</mapper>

View file

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.SignalMapper">
<resultMap id="subjectDataResultMap" type="ru.nbch.credit_tracker.entities.dto.SubjectData">
<result property="id" column="id"/>
<result property="packageId" column="package_id"/>
<result property="subjectId" column="subject_id"/>
<result property="phone" column="phone"/>
<result property="fid" column="fid"/>
<result property="flagDebt5000" column="flag_debt5000"/>
<result property="flag90days" column="flag_90_12"/>
<result property="calculatedAt" column="calculated_at"/>
</resultMap>
<insert id="registerSubjects" parameterType="java.util.List">
INSERT INTO signals_phone_fid_map (subject_id, phone, fid, package_id)
values
<foreach collection="subjects" item="subject" separator=",">
(#{subject.id}, #{subject.clientId}, NULL, #{packageId})
</foreach>
</insert>
<update id="updateSubjects" parameterType="java.util.List">
<foreach collection="subjects" item="subject" separator=";">
UPDATE signals_phone_fid_map
SET
package_id = #{subject.packageId},
subject_id = #{subject.subjectId},
phone = #{subject.phone},
fid = #{subject.fid},
flag_debt5000 = #{subject.flagDebt5000},
flag_90_12 = #{subject.flag90days},
calculated_at = #{subject.calculatedAt}
WHERE id = #{subject.id}
</foreach>
</update>
<update id="registerSubjectsFidAndDebts">
UPDATE signals_phone_fid_map
SET fid = #{fid}, flag_debt5000 = #{flagDebt5000}, flag_90_12 = #{flag90}, calculated_at = #{calculatedAt}
WHERE id = #{id}
</update>
<select id="findSubjectsData" resultMap="subjectDataResultMap" resultType="java.util.List">
SELECT id, subject_id, phone
FROM signals_phone_fid_map
WHERE package_id = #{packageId}
</select>
<select id="findFullSubjectsData" resultMap="subjectDataResultMap" resultType="java.util.List">
SELECT id,
package_id,
subject_id,
phone,
fid,
flag_90_12,
flag_debt5000,
calculated_at
FROM signals_phone_fid_map
WHERE package_id = #{packageId}
</select>
</mapper>

View file

@ -3,18 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.SignalMapper">
<resultMap id="subjectDataResultMap" type="ru.nbch.credit_tracker.entities.dto.SubjectData">
<result property="id" column="id"/>
<result property="packageId" column="package_id"/>
<result property="subjectId" column="subject_id"/>
<result property="phone" column="phone"/>
<result property="fid" column="fid"/>
<result property="flagDebt5000" column="flag_debt5000"/>
<result property="flag90days" column="flag_90_12"/>
<result property="calculatedAt" column="calculated_at"/>
</resultMap>
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.UserPackageMapper">
<resultMap id="packageDataResultMap" type="ru.nbch.credit_tracker.entities.dto.PackageData">
<result property="id" column="id"/>
@ -61,43 +50,6 @@
values (#{request.userId}, #{request.packageName}, #{creadedAt}, #{status})
</insert>
<insert id="registerSubjects" parameterType="java.util.List">
INSERT INTO signals_phone_fid_map (subject_id, phone, fid, package_id)
values
<foreach collection="subjects" item="subject" separator=",">
(#{subject.id}, #{subject.clientId}, NULL, #{packageId})
</foreach>
</insert>
<insert id="setHits" parameterType="java.util.List">
INSERT INTO signals_hits (package_id, subject_id, signal_type, response_sent_at, report_file_name)
values
<foreach collection="hits" item="hit" separator=",">
(#{hit.packageId}, #{hit.subjectId}, #{hit.signalType}, #{hit.responseSentAt}, #{hit.reportFileName})
</foreach>
</insert>
<update id="updateSubjects" parameterType="java.util.List">
<foreach collection="subjects" item="subject" separator=";">
UPDATE signals_phone_fid_map
SET
package_id = #{subject.packageId},
subject_id = #{subject.subjectId},
phone = #{subject.phone},
fid = #{subject.fid},
flag_debt5000 = #{subject.flagDebt5000},
flag_90_12 = #{subject.flag90days},
calculated_at = #{subject.calculatedAt}
WHERE id = #{subject.id}
</foreach>
</update>
<update id="registerSubjectsFidAndDebts">
UPDATE signals_phone_fid_map
SET fid = #{fid}, flag_debt5000 = #{flagDebt5000}, flag_90_12 = #{flag90}, calculated_at = #{calculatedAt}
WHERE id = #{id}
</update>
<update id="setPackageStatus">
UPDATE signals_user_packages
SET status = #{status}
@ -110,25 +62,6 @@
WHERE id = #{id}
</update>
<select id="findSubjectsData" resultMap="subjectDataResultMap" resultType="java.util.List">
SELECT id, subject_id, phone
FROM signals_phone_fid_map
WHERE package_id = #{packageId}
</select>
<select id="findFullSubjectsData" resultMap="subjectDataResultMap" resultType="java.util.List">
SELECT id,
package_id,
subject_id,
phone,
fid,
flag_90_12,
flag_debt5000,
calculated_at
FROM signals_phone_fid_map
WHERE package_id = #{packageId}
</select>
<select id="findPackageData" resultMap="packageDataResultMap"
resultType="ru.nbch.credit_tracker.entities.dto.PackageData">
SELECT membercode, package_name