Added database registration for packege and subject

This commit is contained in:
Mikhail Trofimov 2025-06-05 16:47:11 +03:00
parent ace8bd46e4
commit 2b5bd8c120
5 changed files with 110 additions and 1 deletions

View file

@ -0,0 +1,9 @@
package ru.nbch.credit_tracker.enums;
public enum Status {
ON_MONITORING, // пакет стоит на мониторинге в оф. сервисе
REJECTED, // отклонен на стороне НБКИ
PROCESSING, // идет поиск телефона и расчет флагов по пакету
DELETED, // пакет удален
ERROR; // произошла ошибка при постановке пакета на мониторинг в оф. сервис
}

View file

@ -11,6 +11,7 @@ import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.enums.SignalError;
import ru.nbch.credit_tracker.exceptions.ValidationException; import ru.nbch.credit_tracker.exceptions.ValidationException;
import ru.nbch.credit_tracker.service.FailureAnswerGenerator; import ru.nbch.credit_tracker.service.FailureAnswerGenerator;
import ru.nbch.credit_tracker.service.SignalService;
import ru.nbch.credit_tracker.service.scoring.AuthorizationService; import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
import ru.nbch.credit_tracker.service.xml.IXmlProcessor; import ru.nbch.credit_tracker.service.xml.IXmlProcessor;
import ru.nbch.credit_tracker.service.xml.XmlUtilService; import ru.nbch.credit_tracker.service.xml.XmlUtilService;
@ -25,15 +26,18 @@ public class SignalFacade {
private final CreditTrackerSettings config; private final CreditTrackerSettings config;
private final AuthorizationService authorizationService; private final AuthorizationService authorizationService;
private final SignalService signalService;
private final FailureAnswerGenerator failureAnswerGenerator; private final FailureAnswerGenerator failureAnswerGenerator;
private final XmlUtilService xmlUtilService; private final XmlUtilService xmlUtilService;
public SignalFacade(CreditTrackerSettings config, public SignalFacade(CreditTrackerSettings config,
AuthorizationService authorizationService, AuthorizationService authorizationService,
SignalService signalService,
FailureAnswerGenerator failureAnswerGenerator, FailureAnswerGenerator failureAnswerGenerator,
XmlUtilService xmlUtilService) { XmlUtilService xmlUtilService) {
this.config = config; this.config = config;
this.authorizationService = authorizationService; this.authorizationService = authorizationService;
this.signalService = signalService;
this.failureAnswerGenerator = failureAnswerGenerator; this.failureAnswerGenerator = failureAnswerGenerator;
this.xmlUtilService = xmlUtilService; this.xmlUtilService = xmlUtilService;
} }
@ -93,6 +97,7 @@ public class SignalFacade {
validateRequestByXsd(zipInputStream); validateRequestByXsd(zipInputStream);
} catch (ValidationException e) { } catch (ValidationException e) {
// записать REJECTED
return getBadResponse(SignalError.ERROR_011); // TODO вычленять конкретный элемент return getBadResponse(SignalError.ERROR_011); // TODO вычленять конкретный элемент
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
@ -100,17 +105,27 @@ public class SignalFacade {
return ResponseEntity.internalServerError().body(new PathResource(errorPath)); return ResponseEntity.internalServerError().body(new PathResource(errorPath));
} }
MonitoringRequest monitoringRequest;
// Xml валиден. Производим анмаршаллинг // Xml валиден. Производим анмаршаллинг
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) { try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
zipInputStream.getNextEntry(); zipInputStream.getNextEntry();
IXmlProcessor processor = xmlUtilService.createJaxbProcessor(); IXmlProcessor processor = xmlUtilService.createJaxbProcessor();
MonitoringRequest monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class); monitoringRequest = processor.read(zipInputStream, MonitoringRequest.class);
if (!authorizationService.hasAuthorization(monitoringRequest.getUserId(), monitoringRequest.getPassword())) { if (!authorizationService.hasAuthorization(monitoringRequest.getUserId(), monitoringRequest.getPassword())) {
// записать REJECTED
return getBadResponse(SignalError.ERROR_005); return getBadResponse(SignalError.ERROR_005);
} }
if (signalService.isPackageNotUnique(monitoringRequest)) {
// записать REJECTED
// signalService.insertPackage(monitoringRequest, Status.REJECTED);
return getBadResponse(SignalError.ERROR_007);
}
signalService.registerPackage(monitoringRequest);
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001); String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_001);

View file

@ -0,0 +1,21 @@
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.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.entities.monitoring_request.Subject;
import java.time.LocalDateTime;
import java.util.List;
@Mapper
public interface SignalMapper {
boolean isPackageNotUnique(@Param("userId") String userId, @Param("packageName") String packageName);
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);
}

View file

@ -0,0 +1,31 @@
package ru.nbch.credit_tracker.service;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.mapper.signal.SignalMapper;
import java.time.LocalDateTime;
@Service
public class SignalService {
private final SignalMapper mapper;
public SignalService(SignalMapper mapper) {
this.mapper = mapper;
}
public boolean isPackageNotUnique(MonitoringRequest request) {
String userId = request.getUserId();
return mapper.isPackageNotUnique(userId.substring(0, 6),request.getPackageName());
}
public void registerPackage(MonitoringRequest request) {
Integer packageId = mapper.registerPackage(request, LocalDateTime.now(), Status.PROCESSING.name());
mapper.registerSubjects(request.getSubjects().getSubject(), packageId);
}
public void insertPackage(MonitoringRequest request, Status status) {
mapper.insertPackage(request, LocalDateTime.now(), status.name());
}
}

View file

@ -0,0 +1,33 @@
<?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">
<select id="isPackageNotUnique" resultType="boolean">
SELECT COUNT(*) > 0
FROM signals_user_packages
WHERE membercode IS NOT NULL AND LEFT(membercode, 6) = #{userId} AND package_name = #{packageName}
</select>
<select id="registerPackage" resultType="java.lang.Integer" parameterType="ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest" >
INSERT INTO signals_user_packages (membercode, package_name, created_at, status)
values (#{request.userId}, #{request.packageName}, #{creadedAt}, #{status})
RETURNING id
</select>
<insert id="insertPackage" parameterType="ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest" >
INSERT INTO signals_user_packages (membercode, package_name, created_at, status)
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>
</mapper>