add new tables

This commit is contained in:
etreschenkov 2025-11-25 15:59:51 +03:00
parent 015c7ca24b
commit 0f98d8d28d
13 changed files with 175 additions and 31 deletions

View file

@ -11,7 +11,7 @@ ct.indic-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
ct.indic-data-source-settings.url=${DB_URL_INDIC:jdbc:db2://10.230.227.100:2668/cprosd22:currentSchema=INDIC;} ct.indic-data-source-settings.url=${DB_URL_INDIC:jdbc:db2://10.230.227.100:2668/cprosd22:currentSchema=INDIC;}
ct.indic-data-source-settings.username=${USERNAME_INDIC:ros9appl} ct.indic-data-source-settings.username=${USERNAME_INDIC:ros9appl}
ct.indic-data-source-settings.password=${PASSWORD_INDIC:R0s9Appl} ct.indic-data-source-settings.password=${PASSWORD_INDIC:R0s9Appl}
ct.indic-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_INDIC:10} ct.indic-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_INDIC:30}
ct.indic-data-source-settings.minimum-idle=${MINIMUM_IDLE_INDIC:10} ct.indic-data-source-settings.minimum-idle=${MINIMUM_IDLE_INDIC:10}
ct.indic-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_INDIC:10000} ct.indic-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_INDIC:10000}
ct.indic-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_INDIC:5000} ct.indic-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_INDIC:5000}
@ -25,7 +25,7 @@ ct.signal-data-source-settings.driver=org.postgresql.Driver
ct.signal-data-source-settings.url=${DB_URL_SIGNAL:jdbc:postgresql://10.200.200.133:5432/credit_tracker} ct.signal-data-source-settings.url=${DB_URL_SIGNAL:jdbc:postgresql://10.200.200.133:5432/credit_tracker}
ct.signal-data-source-settings.username=${USERNAME_SIGNAL:credit_tracker_user} ct.signal-data-source-settings.username=${USERNAME_SIGNAL:credit_tracker_user}
ct.signal-data-source-settings.password=${PASSWORD_SIGNAL:-} ct.signal-data-source-settings.password=${PASSWORD_SIGNAL:-}
ct.signal-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SIGNAL:10} ct.signal-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SIGNAL:40}
ct.signal-data-source-settings.minimum-idle=${MINIMUM_IDLE_SIGNAL:10} ct.signal-data-source-settings.minimum-idle=${MINIMUM_IDLE_SIGNAL:10}
ct.signal-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SIGNAL:10000} ct.signal-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SIGNAL:10000}
ct.signal-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SIGNAL:5000} ct.signal-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SIGNAL:5000}
@ -39,7 +39,7 @@ ct.scoring-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
ct.scoring-data-source-settings.url=${DB_URL_SCORING:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;} ct.scoring-data-source-settings.url=${DB_URL_SCORING:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;}
ct.scoring-data-source-settings.username=${USERNAME_SCORING:tester} ct.scoring-data-source-settings.username=${USERNAME_SCORING:tester}
ct.scoring-data-source-settings.password=${PASSWORD_SCORING:tester} ct.scoring-data-source-settings.password=${PASSWORD_SCORING:tester}
ct.scoring-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SCORING:10} ct.scoring-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SCORING:30}
ct.scoring-data-source-settings.minimum-idle=${MINIMUM_IDLE_SCORING:10} ct.scoring-data-source-settings.minimum-idle=${MINIMUM_IDLE_SCORING:10}
ct.scoring-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SCORING:10000} ct.scoring-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SCORING:10000}
ct.scoring-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SCORING:5000} ct.scoring-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SCORING:5000}
@ -56,7 +56,7 @@ spring.servlet.multipart.max-request-size=${ACCEPTED_ARCHIVE_SIZE:2048MB}
ct.xsd-validation.monitoring-request-path=monitoring-request.xsd ct.xsd-validation.monitoring-request-path=monitoring-request.xsd
ct.xsd-validation.signal-package-path=signal-package.xsd ct.xsd-validation.signal-package-path=signal-package.xsd
ct.signals-root-uri=${SIGNALS_ROOT_URI:http://10.230.227.102:11094/signalRUalfa/} ct.signals-root-uri=${SIGNALS_ROOT_URI:http://127.0.01:11094/signalRUalfa/}
ct.signals-token=${SIGNALS_TOKEN:gttcHxwcGojoAvZK} ct.signals-token=${SIGNALS_TOKEN:gttcHxwcGojoAvZK}
ct.signals-user=${SIGNALS_USER:0001ZZ000001} ct.signals-user=${SIGNALS_USER:0001ZZ000001}
@ -73,7 +73,21 @@ ct.db-version=${DB_VERSION:1234}
ct.encoding=windows-1251 ct.encoding=windows-1251
#Batch size and global pipeline timeout
ct.batchSize=1000 #----------------------------Pipeline settings----------------------------#
#in minute #???-?? ????????? ?? xml ?? ???? ????????????
ct.timeout=30 ct.saver-subject-batch-size=15000
ct.pipeline.subject-batch-size=5000
#????????? ? PHONE ? NAME + ?????? ? ???? SIGNALS_PHONE_FID_MAP
ct.pipeline.name-enricher-stage-concurrency=20
#????????? ? ID ? ?????? ????? xml ??? ??. ???????
ct.pipeline.id-enricher-stage-concurrency=10
#?????????? ??????? ??? ??????
ct.pipeline.error-attempt-count=5
#????? ???????? ????? ????????? ???????
ct.pipeline.error-attempt-delay=2s
#??????? ?? ???? ???????
ct.pipeline.global-timeout=2h
#???-?? ??????????? ???????????? ?????????????? ????????
ct.pipeline.parallel-requests=3
ct.pipeline.retryable-exceptions=org.springframework.dao.DataAccessException,org.springframework.dao.DataIntegrityViolationException

View file

@ -35,4 +35,5 @@ public class CreditTrackerSettings {
private Long daysToUpdateFlags; private Long daysToUpdateFlags;
private String encoding; private String encoding;
private String dbVersion; private String dbVersion;
private Integer saverSubjectBatchSize;
} }

View file

@ -17,5 +17,5 @@ public class UserPackage {
private String status; private String status;
private LocalDateTime deactivatedAt; private LocalDateTime deactivatedAt;
private String lastDownloadedReport; private String lastDownloadedReport;
private LocalDateTime monitoringAt; // private LocalDateTime monitoringAt;
} }

View file

@ -128,7 +128,7 @@ public class SignalFacadeV3 {
Long packageId = signalService.registerPackage(userId, packageName); Long packageId = signalService.registerPackage(userId, packageName);
LogUtil.addMdcLogKey("%s %d".formatted(packageName, packageId)); LogUtil.addMdcLogKey("%s %d".formatted(packageName, packageId));
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name()); log.info("Package registered. PackageId {}. Status: {}", packageId, Status.ACCEPTED.name());
pipelinePackageManager.buildAndRun(packageId, parsedFilePath); pipelinePackageManager.buildAndRun(packageId, parsedFilePath);
} catch (Exception e) { } catch (Exception e) {
try { try {

View file

@ -17,7 +17,7 @@ public interface PhoneFidMapMapper {
void setFidJson(@Param("json") String json); void setFidJson(@Param("json") String json);
void registerWithId(@Param("phoneFidMap") List<PhoneFidMap> phoneFidMap); void registerWithId(@Param("phoneFidMap") List<PhoneFidMap> phoneFidMap);
List<PhoneFidMap> findFullPhoneFidMap(@Param("packageId") Long packageId, @Param("offset") int offset, @Param("limit") int limit); List<PhoneFidMap> findFullPhoneFidMap(@Param("packageId") Long packageId, @Param("limit") int limit, @Param("offset") int offset);
void updatePhoneFidMaps(@Param("subjects") Collection<PhoneFidMap> subjects); void updatePhoneFidMaps(@Param("subjects") Collection<PhoneFidMap> subjects);
void updateOne(@Param("subject") PhoneFidMap subject); void updateOne(@Param("subject") PhoneFidMap subject);

View file

@ -37,15 +37,8 @@ public class PhoneRepository {
SELECT SELECT
pn.number, pn.number,
pn.fid, pn.fid,
pn.file_since_dt, pn.file_since_dt
nf.first,
nf.middle,
nf.name_1,
nf.birth_dt,
nf.file_since_dt as file_since_dt_name
FROM PHONE_NORM pn FROM PHONE_NORM pn
JOIN NAME nf
ON nf.fid = pn.fid
WHERE number in (:phones) WITH UR WHERE number in (:phones) WITH UR
"""; """;

View file

@ -69,9 +69,9 @@ public class UpdatingFlagsService {
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, filter); SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, filter);
if (updateResult.isUpdated()) { if (updateResult.isUpdated()) {
if (signalRestService.setupMonitoring(packageId)) { if (signalRestService.setupMonitoring(packageId)) {
LocalDateTime monitoringAt = userPackage.getMonitoringAt() != null ? userPackage.getMonitoringAt() : LocalDateTime.now(); // LocalDateTime monitoringAt = userPackage.getMonitoringAt() != null ? userPackage.getMonitoringAt() : LocalDateTime.now();
log.info("Flags were updated successfully. PackageId: {} PackageName: {} MonitoringAt: {}. Package status changed to ON_MONITORING", packageId, packageName, monitoringAt); log.info("Flags were updated successfully. PackageId: {} PackageName: {}. Package status changed to ON_MONITORING", packageId, packageName);
signalService.updatePackageOnMonitoringSuccess(packageId, monitoringAt); signalService.updatePackageOnMonitoringSuccess(packageId, LocalDateTime.now());
monitoringErrorProcesingService.findErrors(packageId); monitoringErrorProcesingService.findErrors(packageId);
} else { } else {
log.info("Updated package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName); log.info("Updated package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);

View file

@ -90,4 +90,8 @@ public class PhoneService2 {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
public List<PhoneFidMap> nextPage(Long packageId, Integer limit, Integer offset) {
return phoneFidMapMapper.findFullPhoneFidMap(packageId, limit, offset);
}
} }

View file

@ -1,6 +1,7 @@
package ru.nbch.credit_tracker.service.task; package ru.nbch.credit_tracker.service.task;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
@ -21,6 +22,7 @@ import ru.nbch.credit_tracker.service.task.impl.FidIdEnricher;
import ru.nbch.credit_tracker.service.task.impl.FidNameEnricher; import ru.nbch.credit_tracker.service.task.impl.FidNameEnricher;
import ru.nbch.credit_tracker.service.task.impl.FlagsEnricher; import ru.nbch.credit_tracker.service.task.impl.FlagsEnricher;
import ru.nbch.credit_tracker.service.task.impl.SaveSubjectHandler; import ru.nbch.credit_tracker.service.task.impl.SaveSubjectHandler;
import ru.nbch.credit_tracker.service.task.impl.Saver;
import ru.nbch.credit_tracker.service.task.impl.XmlMergeCoordinator; import ru.nbch.credit_tracker.service.task.impl.XmlMergeCoordinator;
import ru.nbch.credit_tracker.service.task.setup.IPipeLineStarter; import ru.nbch.credit_tracker.service.task.setup.IPipeLineStarter;
import ru.nbch.credit_tracker.service.task.setup.IPipeLineTerminator; import ru.nbch.credit_tracker.service.task.setup.IPipeLineTerminator;
@ -48,8 +50,15 @@ public class PipelinePackageManager {
t.setName("pipe-starter-%d".formatted(t.threadId())); t.setName("pipe-starter-%d".formatted(t.threadId()));
return t; return t;
}); });
private final ExecutorService subjectSaverExecutor = Executors.newFixedThreadPool(3, r -> {
Thread t = new Thread(r);
t.setName("subject-saver-%d".formatted(t.threadId()));
return t;
});
private final Semaphore semaphore; private final Semaphore semaphore;
private final PipelineBackoff pipelineBackoff; private final PipelineBackoff pipelineBackoff;
private final Saver saver;
private final static int MAX_PARALLEL_REQUESTS = 3; private final static int MAX_PARALLEL_REQUESTS = 3;
public PipelinePackageManager(SignalRestService signalRestService, public PipelinePackageManager(SignalRestService signalRestService,
@ -64,7 +73,7 @@ public class PipelinePackageManager {
BiFunction<Long, Path, IPipeLineStarter<SubjectPayload>> pipelineStarterFactory, BiFunction<Long, Path, IPipeLineStarter<SubjectPayload>> pipelineStarterFactory,
FlagsEnricher flagsEnricherV2, FidNameEnricher fidNameEnricher, FlagsEnricher flagsEnricherV2, FidNameEnricher fidNameEnricher,
CreditTrackerSettings creditTrackerSettings, CreditTrackerSettings creditTrackerSettings,
PipelineBackoff pipelineBackoff) { PipelineBackoff pipelineBackoff, Saver saver) {
this.signalRestService = signalRestService; this.signalRestService = signalRestService;
this.saveSubjectQueueFactory = saveSubjectQueueFactory; this.saveSubjectQueueFactory = saveSubjectQueueFactory;
this.idEnricherQueueFactory = idEnricherQueueFactory; this.idEnricherQueueFactory = idEnricherQueueFactory;
@ -81,6 +90,7 @@ public class PipelinePackageManager {
this.semaphore = new Semaphore(creditTrackerSettings.getPipeline().parallelRequests()); this.semaphore = new Semaphore(creditTrackerSettings.getPipeline().parallelRequests());
log.info("pipeline settings: {}", creditTrackerSettings.getPipeline()); log.info("pipeline settings: {}", creditTrackerSettings.getPipeline());
this.pipelineBackoff = pipelineBackoff; this.pipelineBackoff = pipelineBackoff;
this.saver = saver;
} }
public void buildAndRun(Long packageId, Path pkgPath) throws Exception { public void buildAndRun(Long packageId, Path pkgPath) throws Exception {
@ -90,10 +100,7 @@ public class PipelinePackageManager {
log.info("throttler permits after acquire: {}", semaphore.availablePermits()); log.info("throttler permits after acquire: {}", semaphore.availablePermits());
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
try { try {
Pipeline pipeline = PipeLineBuilderV2.first(saveSubjectQueueFactory.getObject(), idEnricherQueueFactory.getObject()) Pipeline pipeline = PipeLineBuilderV2.first(nameEnricherQueueFactory.getObject(), idEnricherQueueFactory.getObject())
.handler(saveSubjectHandler)
.andThen()
.stage(nameEnricherQueueFactory.getObject())
.handler(fidNameEnricher) .handler(fidNameEnricher)
.handlerResult(flagsEnricherV2) .handlerResult(flagsEnricherV2)
.andThen() .andThen()
@ -106,7 +113,6 @@ public class PipelinePackageManager {
.backoff(pipelineBackoff) .backoff(pipelineBackoff)
.build(); .build();
pipeline.start(executorService);
pipeline.getTerminator() pipeline.getTerminator()
.doneFuture() .doneFuture()
.orTimeout(creditTrackerSettings.getPipeline().globalTimeout().toMillis(), TimeUnit.MILLISECONDS) .orTimeout(creditTrackerSettings.getPipeline().globalTimeout().toMillis(), TimeUnit.MILLISECONDS)
@ -133,6 +139,17 @@ public class PipelinePackageManager {
log.info("semaphore amount: {}", semaphore.availablePermits()); log.info("semaphore amount: {}", semaphore.availablePermits());
} }
}); });
CompletableFuture
.runAsync(() -> {
try {
saver.readAndSave(packageId, pkgPath);
} catch (Throwable t) {
log.error(ExceptionUtils.getStackTrace(t));
pipeline.close();
}
}, subjectSaverExecutor)
.thenRun(() -> pipeline.start(executorService));
} catch (Exception e) { } catch (Exception e) {
semaphore.release(); semaphore.release();
throw e; throw e;

View file

@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
import ru.nbch.credit_tracker.entities.app.UserPackage; import ru.nbch.credit_tracker.entities.app.UserPackage;
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest; import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.exceptions.SignalClientException; import ru.nbch.credit_tracker.exceptions.SignalClientException;
@ -56,7 +57,47 @@ public class KickPipeLineImpl implements IPipeLineStarter<SubjectPayload> {
@Override @Override
public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) { public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) {
log.info("Start registering subjects. PackageId: {}", packageId); try {
log.info("Start registering subjects. PackageId: {};", packageId);
int offset = 0;
int limit = BATCH_SIZE;
UserPackage userPackage = userPackageMapper.findPackage(packageId);
List<PhoneFidMap> page = phoneService2.nextPage(packageId, limit, offset);
while (!page.isEmpty()) {
log.debug("Get page {}", page.size());
List<SubjectProfile> subjectProfiles = page.stream().map(phoneFidMap -> SubjectProfile.builder()
.identifier(phoneFidMap.getSubjectId())
.phone(phoneFidMap.getPhone())
.build()).toList();
try {
firstQueue.put(new SubjectPayload(packageId, userPackage.getUserId(), userPackage.getPackageName(), subjectProfiles));
} catch (InterruptedException e) {
isInterrupted = true;
log.error("Pipeline starter was interrupted!");
throw new PipelineStarterException();
}
offset += limit;
page = phoneService2.nextPage(packageId, limit, offset);
}
} catch (PipelineStarterException e) {
log.info("Pipeline starter shitting down...");
} finally {
if (isInterrupted) {
//noinspection ReturnInsideFinallyBlock
return;
}
log.debug("Send poison pill");
try {
SubjectPayload poison = new SubjectPayload(packageId, PoisonType.NORMALLY);
firstQueue.put(poison);
} catch (InterruptedException e) {
log.error("couldn't send poison: {}", ExceptionUtils.getStackTrace(e));
}
}
}
// @Override
public void startFillingQueueXml(BlockingQueue<SubjectPayload> firstQueue) {
log.info("Start registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
UserPackage userPackage = userPackageMapper.findPackage(packageId); UserPackage userPackage = userPackageMapper.findPackage(packageId);
AtomicInteger counter = new AtomicInteger(0); AtomicInteger counter = new AtomicInteger(0);
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) { try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {

View file

@ -0,0 +1,72 @@
package ru.nbch.credit_tracker.service.task.impl;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.SubjectProfile;
import ru.nbch.credit_tracker.service.indic.PhoneService2;
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
@Service
public class Saver {
private final Logger log = LoggerFactory.getLogger(getClass());
private final StaxXmlProcessor xmlProcessor;
private final PhoneService2 phoneService2;
private final UserPackageMapper userPackageMapper;
private final int BATCH_SIZE;
public Saver(StaxXmlProcessor xmlProcessor,
PhoneService2 phoneService2,
UserPackageMapper userPackageMapper,
CreditTrackerSettings creditTrackerSettings) {
this.xmlProcessor = xmlProcessor;
this.phoneService2 = phoneService2;
this.userPackageMapper = userPackageMapper;
this.BATCH_SIZE = creditTrackerSettings.getSaverSubjectBatchSize();
}
public void readAndSave(Long packageId, Path pkgPath) {
log.info("Start registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {
xmlProcessor.read(in, MonitoringRequest.class,
request -> {
if (!request.getSubjects().getSubject().isEmpty()) {
List<SubjectProfile> subjects = request.getSubjects().getSubject().stream().map(subject ->
SubjectProfile.builder()
.identifier(subject.getId())
.phone(subject.getClientId())
.build()
).toList();
log.trace("Reading subject's {} batch. PackageId: {}", request.getSubjects().getSubject().size(), packageId);
List<PhoneFidMap> subjectForSave = subjects.stream().map(subject -> PhoneFidMap.builder()
.subjectId(subject.getIdentifier())
.packageId(packageId)
.phone(subject.getPhone())
.build()).toList();
request.getSubjects().getSubject().clear();
phoneService2.registerSubjects(subjectForSave);
}
},
request -> request.getSubjects().getSubject().isEmpty(),
BATCH_SIZE, "/MonitoringRequest/Subjects/Subject"
);
} catch (IOException e) {
log.error("{}", ExceptionUtils.getStackTrace(e));
}
userPackageMapper.updatePackageStatus(packageId, Status.PROCESSING.name());
log.info("Complete registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
}
}

View file

@ -68,6 +68,8 @@ public class LogUtil {
} }
task.run(); task.run();
} catch (Throwable e) {
log.error(ExceptionUtils.getStackTrace(e));
} finally { } finally {
// восстанавливаем предыдущий (может быть null) // восстанавливаем предыдущий (может быть null)
try { try {

View file

@ -13,7 +13,7 @@
<result property="status" column="status"/> <result property="status" column="status"/>
<result property="deactivatedAt" column="deactivated_at"/> <result property="deactivatedAt" column="deactivated_at"/>
<result property="lastDownloadedReport" column="last_downloaded_report"/> <result property="lastDownloadedReport" column="last_downloaded_report"/>
<result property="monitoringAt" column="monitoring_at"/> <!-- <result property="monitoringAt" column="monitoring_at"/>-->
</resultMap> </resultMap>
<select id="isPackageNotUnique" resultType="boolean"> <select id="isPackageNotUnique" resultType="boolean">
@ -90,7 +90,7 @@
<select id="findPackage" resultMap="packageDataResultMap" <select id="findPackage" resultMap="packageDataResultMap"
resultType="ru.nbch.credit_tracker.entities.app.UserPackage"> resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report
FROM signals_user_packages FROM signals_user_packages
WHERE id = #{id} WHERE id = #{id}
LIMIT 1 LIMIT 1