Compare commits
3 commits
master
...
monitoring
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
67a72761e6 | ||
|
|
c2c1eab58b | ||
|
|
1e8b19d663 |
70 changed files with 600 additions and 1575 deletions
|
|
@ -1,5 +1,6 @@
|
|||
FROM eclipse-temurin:17-jre-alpine
|
||||
MAINTAINER ru.nbch
|
||||
RUN apk add gcompat bash
|
||||
|
||||
VOLUME /opt/app/logs/app
|
||||
VOLUME /opt/app/logs/json
|
||||
|
|
@ -13,11 +14,6 @@ COPY maven/start-credit-tracker.sh /opt/app/start-credit-tracker.sh
|
|||
COPY maven/credit-tracker.properties /opt/app/credit-tracker.properties
|
||||
COPY maven/monitoring-request.xsd /opt/app/monitoring-request.xsd
|
||||
COPY maven/signal-package.xsd /opt/app/signal-package.xsd
|
||||
COPY maven/ca_nbki.cer /usr/local/share/ca-certificates/corp.crt
|
||||
|
||||
RUN apk add --no-cache ca-certificates \
|
||||
&& update-ca-certificates \
|
||||
RUN apk add gcompat bash
|
||||
|
||||
RUN chmod +x /opt/app/start-credit-tracker.sh
|
||||
ENTRYPOINT ["/opt/app/start-credit-tracker.sh"]
|
||||
|
|
|
|||
33
ca_nbki.cer
33
ca_nbki.cer
|
|
@ -1,33 +0,0 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIFpTCCA42gAwIBAgIQXRfulgQYrrRFEpmSkmctvzANBgkqhkiG9w0BAQsFADBH
|
||||
MRMwEQYKCZImiZPyLGQBGRYDbXNrMRQwEgYKCZImiZPyLGQBGRYEbmJraTEaMBgG
|
||||
A1UEAxMRTkJLSS1Sb290LUNBLTIwMzIwHhcNMTQwNTE1MDYxODMzWhcNMzcwMjAx
|
||||
MTE1OTEyWjBHMRMwEQYKCZImiZPyLGQBGRYDbXNrMRQwEgYKCZImiZPyLGQBGRYE
|
||||
bmJraTEaMBgGA1UEAxMRTkJLSS1Sb290LUNBLTIwMzIwggIiMA0GCSqGSIb3DQEB
|
||||
AQUAA4ICDwAwggIKAoICAQCjS1l6kx+tjX2PGmQcVw9wg0Q6SCeWbiz7rxAYZPqE
|
||||
OGckXWWjtfUOc8BhD3+BnC4BQ414X1HP2OWQ97pa2LogTksbpNpJ0+p82IPAYxV+
|
||||
zpI0FnW09FpzjtB6l/1kE9gKecjBoFG3xDhhFmpzCeK7tsKt94j84XPV/Zo82gYM
|
||||
egmqhOfQZ+2HAChBj7gaBJALybFN34wkvN9bWdBPmK/j1jQikEAT8QE9qwcdmCKB
|
||||
snHw+heYX4uJyZEkXEzW8GxQfTaAL+3d8HdRm1ZT/dN9KScF3Tp13LnQPCcixYoB
|
||||
dF9Pd3P8JDAQX1KUVceLq6e75Q36EQaHHfEA8iQjaKlEzD049QbfAfCzKkSTnxHk
|
||||
rOGwhm/h3ipwdAL4eqWkXfRriEvQU2fXGYXS0bhDT0/vBVAhHUMZ15/Oww0QSlc9
|
||||
clpau6rYG4m/Fmm8LPyEHROenbNwu35TqLl+CUFES25aE2oZcH6+SyE5dDgpX9e1
|
||||
Plt3fT6DuEDuT+rWvm0N8NVPNlQP/1lcbvP1oQrby07LToPatdKF9V5g8MX/19bP
|
||||
BFsQsUHLlfffWMqqX8W/OPt5da3XL6U7Z8aBdhS7VAqqrvNhAbJBxgyJAzSfSwtZ
|
||||
K5dZTKrJMZqmosUSIrLVr+9oXlbqJjKGNWQjwCfRQmPPkCpmpy1SRg8NPDoa3OVU
|
||||
3wIDAQABo4GMMIGJMBMGCSsGAQQBgjcUAgQGHgQAQwBBMAsGA1UdDwQEAwIBhjAP
|
||||
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSkqLxdQSQ2+UIWrqSnms7lhp5zLjAQ
|
||||
BgkrBgEEAYI3FQEEAwIBATAjBgkrBgEEAYI3FQIEFgQUvM7jX4RA4XBrZqhNhpl6
|
||||
EDcEMZEwDQYJKoZIhvcNAQELBQADggIBAINqzWxlGXFgMwSlWmH4ocDa0A3ip51C
|
||||
nEaWB58aomzOZYHnNLXj4KiwY59TMDkiRiql4wWCw2AJBVv2//7JwOqrk8rixq02
|
||||
95NVX9TNefMKY3oo/g9bSqEsxoHgOoXP0QiY4GrYwAL6Bl0d/V9KUw5+BzBx/DKo
|
||||
ncWD6KHnwFPBnHhIWiFlRAy2dX55rg6YSpB5/IlTQxGTjeg0OjX5w0ZE3L/0GZBl
|
||||
O5W2E0RvUSErbjzoisxrhG48Mo5TtoGTmazKHRDqRCuZVnV0uEL9XaUOOV3G+LlP
|
||||
/ujADUkF4iiIgoynB0W30fpwEqQFBSUxe+KzMw10ojaYaSz2g/HEg9ZKxy1a/bDL
|
||||
6Va+vUMrypg26+MFrEdUwpPuORV1chtah/t+OxSk1dO82cuhjmRHX79mRwqjmXUs
|
||||
5I/fNey8JWLCAV+Acf24CepdeYzeBGdh94t9FqTWw7aJaN5vL9ghwyG7JT8ozAfp
|
||||
wYa1vq3nq+7SiELenQYYEUl792V8OsRV6N9nJkoLC12R9HGHjxMja5O2+Sw9LU4p
|
||||
TjQcJt+qhT/c5+i6tQMjJUCTpXtOkaEezwrPpbUcoluGsz9vxs84eDtHiwumUCGj
|
||||
XgaMSjcnY35dgne/x3kXcLYazdUYDoyYOEkgKG7ncSFg0lnIgwtYpqW6tzL3t9KN
|
||||
Tsm6UcBOJAnv
|
||||
-----END CERTIFICATE-----
|
||||
|
|
@ -11,42 +11,18 @@ 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.101:2668/cprosd22:currentSchema=INDIC;}
|
||||
ct.indic-data-source-settings.username=${USERNAME_INDIC:tester}
|
||||
ct.indic-data-source-settings.password=${PASSWORD_INDIC:tester}
|
||||
ct.indic-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_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.validation-timeout=${VALIDATION_TIMEOUT_INDIC:5000}
|
||||
ct.indic-data-source-settings.idle-timeout=${IDLE_TIMEOUT_INDIC:600000}
|
||||
ct.indic-data-source-settings.max-lifetime=${MAX_LIFETIME_INDIC:1800000}
|
||||
ct.indic-data-source-settings.keepalive-time=${KEEPALIVE_TIME_INDIC:0}
|
||||
ct.indic-data-source-settings.leak-detection-threshold=${LEAK_DETECTION_THRESHOLD_INDIC:0}
|
||||
|
||||
# signal
|
||||
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.username=${USERNAME_SIGNAL:credit_tracker_user}
|
||||
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.minimum-idle=${MINIMUM_IDLE_SIGNAL:10}
|
||||
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.idle-timeout=${IDLE_TIMEOUT_SIGNAL:600000}
|
||||
ct.signal-data-source-settings.max-lifetime=${MAX_LIFETIME_SIGNAL:1800000}
|
||||
ct.signal-data-source-settings.keepalive-time=${KEEPALIVE_TIME_SIGNAL:0}
|
||||
ct.signal-data-source-settings.leak-detection-threshold=${LEAK_DETECTION_THRESHOLD_SIGNAL:0}
|
||||
|
||||
# scoring
|
||||
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.username=${USERNAME_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.minimum-idle=${MINIMUM_IDLE_SCORING:10}
|
||||
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.idle-timeout=${IDLE_TIMEOUT_SCORING:600000}
|
||||
ct.scoring-data-source-settings.max-lifetime=${MAX_LIFETIME_SCORING:1800000}
|
||||
ct.scoring-data-source-settings.keepalive-time=${KEEPALIVE_TIME_SCORING:0}
|
||||
ct.scoring-data-source-settings.leak-detection-threshold=${LEAK_DETECTION_THRESHOLD_SCORING:0}
|
||||
|
||||
ct.max_xml_file_size=${ACCEPTED_XML_SIZE:1024}
|
||||
spring.servlet.multipart.max-file-size=${ACCEPTED_ARCHIVE_SIZE:2048MB}
|
||||
|
|
@ -66,7 +42,7 @@ ct.load-dir=/opt/app/reports
|
|||
# min
|
||||
ct.monitoring-interval=${MONITORING_INTERVAL:15}
|
||||
# days
|
||||
ct.update-flags-cron-expression=${UPDATE_FLAGS_CRON_EXPRESSION:0 0 22 * * *}
|
||||
ct.update-flags-interval=${UPDATE_FLAGS_INTERVAL:1}
|
||||
ct.days-to-update-flags=${DAYS_TO_UPDATE_FLAGS:30}
|
||||
|
||||
ct.encoding=windows-1251
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
#commons
|
||||
APP_VERSION=1.24
|
||||
APP_VERSION=1.9
|
||||
REGISTRY_URL=rh8-vm3.nbki.msk:5000
|
||||
JMX_PORT=
|
||||
JMX_HOSTNAME=
|
||||
|
|
@ -24,41 +24,16 @@ SERVER_PORT=8099
|
|||
DB_URL_INDIC=jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=INDIC;
|
||||
USERNAME_INDIC=tester
|
||||
PASSWORD_INDIC=tester
|
||||
MAXIMUM_POOL_SIZE_INDIC=10
|
||||
MINIMUM_IDLE_INDIC=10
|
||||
CONNECTION_TIMEOUT_INDIC=10000
|
||||
VALIDATION_TIMEOUT_INDIC=5000
|
||||
IDLE_TIMEOUT_INDIC=600000
|
||||
MAX_LIFETIME_INDIC=1800000
|
||||
KEEPALIVE_TIME_INDIC=0
|
||||
LEAK_DETECTION_THRESHOLD_INDIC=0
|
||||
|
||||
|
||||
# signal
|
||||
DB_URL_SIGNAL=jdbc:postgresql://10.200.200.133:5432/credit_tracker
|
||||
USERNAME_SIGNAL=credit_tracker_user
|
||||
PASSWORD_SIGNAL=
|
||||
MAXIMUM_POOL_SIZE_SIGNAL=10
|
||||
MINIMUM_IDLE_SIGNAL=10
|
||||
CONNECTION_TIMEOUT_SIGNAL=10000
|
||||
VALIDATION_TIMEOUT_SIGNAL=5000
|
||||
IDLE_TIMEOUT_SIGNAL=600000
|
||||
MAX_LIFETIME_SIGNAL=1800000
|
||||
KEEPALIVE_TIME_SIGNAL=0
|
||||
LEAK_DETECTION_THRESHOLD_SIGNAL=0
|
||||
|
||||
# scoring
|
||||
DB_URL_SCORING=jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;
|
||||
USERNAME_SCORING=tester
|
||||
PASSWORD_SCORING=tester
|
||||
MAXIMUM_POOL_SIZE_SCORING=10
|
||||
MINIMUM_IDLE_SCORING=10
|
||||
CONNECTION_TIMEOUT_SCORING=10000
|
||||
VALIDATION_TIMEOUT_SCORING=5000
|
||||
IDLE_TIMEOUT_SCORING=600000
|
||||
MAX_LIFETIME_SCORING=1800000
|
||||
KEEPALIVE_TIME_SCORING=0
|
||||
LEAK_DETECTION_THRESHOLD_SCORING=0
|
||||
|
||||
# размер в mb
|
||||
ACCEPTED_XML_SIZE=1024
|
||||
|
|
@ -71,7 +46,7 @@ SIGNALS_USER=0001ZZ000001
|
|||
# min
|
||||
MONITORING_INTERVAL=15
|
||||
# days
|
||||
UPDATE_FLAGS_CRON_EXPRESSION=0 22 * * *
|
||||
UPDATE_FLAGS_INTERVAL=1
|
||||
DAYS_TO_UPDATE_FLAGS=30
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -23,36 +23,12 @@ services:
|
|||
- DB_URL_INDIC=${DB_URL_INDIC}
|
||||
- USERNAME_INDIC=${USERNAME_INDIC}
|
||||
- PASSWORD_INDIC=${PASSWORD_INDIC}
|
||||
- MAXIMUM_POOL_SIZE_INDIC=${MAXIMUM_POOL_SIZE_INDIC}
|
||||
- MINIMUM_IDLE_INDIC=${MINIMUM_IDLE_INDIC}
|
||||
- CONNECTION_TIMEOUT_INDIC=${CONNECTION_TIMEOUT_INDIC}
|
||||
- VALIDATION_TIMEOUT_INDIC=${VALIDATION_TIMEOUT_INDIC}
|
||||
- IDLE_TIMEOUT_INDIC=${IDLE_TIMEOUT_INDIC}
|
||||
- MAX_LIFETIME_INDIC=${MAX_LIFETIME_INDIC}
|
||||
- KEEPALIVE_TIME_INDIC=${KEEPALIVE_TIME_INDIC}
|
||||
- LEAK_DETECTION_THRESHOLD_INDIC=${LEAK_DETECTION_THRESHOLD_INDIC}
|
||||
- DB_URL_SIGNAL=${DB_URL_SIGNAL}
|
||||
- USERNAME_SIGNAL=${USERNAME_SIGNAL}
|
||||
- PASSWORD_SIGNAL=${PASSWORD_SIGNAL}
|
||||
- MAXIMUM_POOL_SIZE_SIGNAL=${MAXIMUM_POOL_SIZE_SIGNAL}
|
||||
- MINIMUM_IDLE_SIGNAL=${MINIMUM_IDLE_SIGNAL}
|
||||
- CONNECTION_TIMEOUT_SIGNAL=${CONNECTION_TIMEOUT_SIGNAL}
|
||||
- VALIDATION_TIMEOUT_SIGNAL=${VALIDATION_TIMEOUT_SIGNAL}
|
||||
- IDLE_TIMEOUT_SIGNAL=${IDLE_TIMEOUT_SIGNAL}
|
||||
- MAX_LIFETIME_SIGNAL=${MAX_LIFETIME_SIGNAL}
|
||||
- KEEPALIVE_TIME_SIGNAL=${KEEPALIVE_TIME_SIGNAL}
|
||||
- LEAK_DETECTION_THRESHOLD_SIGNAL=${LEAK_DETECTION_THRESHOLD_SIGNAL}
|
||||
- DB_URL_SCORING=${DB_URL_SCORING}
|
||||
- USERNAME_SCORING=${USERNAME_SCORING}
|
||||
- PASSWORD_SCORING=${PASSWORD_SCORING}
|
||||
- MAXIMUM_POOL_SIZE_SCORING=${MAXIMUM_POOL_SIZE_SCORING}
|
||||
- MINIMUM_IDLE_SCORING=${MINIMUM_IDLE_SCORING}
|
||||
- CONNECTION_TIMEOUT_SCORING=${CONNECTION_TIMEOUT_SCORING}
|
||||
- VALIDATION_TIMEOUT_SCORING=${VALIDATION_TIMEOUT_SCORING}
|
||||
- IDLE_TIMEOUT_SCORING=${IDLE_TIMEOUT_SCORING}
|
||||
- MAX_LIFETIME_SCORING=${MAX_LIFETIME_SCORING}
|
||||
- KEEPALIVE_TIME_SCORING=${KEEPALIVE_TIME_SCORING}
|
||||
- LEAK_DETECTION_THRESHOLD_SCORING=${LEAK_DETECTION_THRESHOLD_SCORING}
|
||||
- ACCEPTED_XML_SIZE=${ACCEPTED_XML_SIZE}
|
||||
- ACCEPTED_ARCHIVE_SIZE=${ACCEPTED_ARCHIVE_SIZE}
|
||||
- SIGNALS_ROOT_URI=${SIGNALS_ROOT_URI}
|
||||
|
|
|
|||
507
pom.xml
507
pom.xml
|
|
@ -1,275 +1,246 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.4.6</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>ru.nbch</groupId>
|
||||
<artifactId>credit-tracker</artifactId>
|
||||
<version>1.24</version>
|
||||
<name>credit_tracker</name>
|
||||
<description>Credit Tracker Application</description>
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.4.6</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>ru.nbch</groupId>
|
||||
<artifactId>credit-tracker</artifactId>
|
||||
<version>1.9</version>
|
||||
<name>credit_tracker</name>
|
||||
<description>Credit Tracker Application</description>
|
||||
|
||||
<properties>
|
||||
<java.version>17</java.version>
|
||||
<git.info.prefix>git_info</git.info.prefix>
|
||||
<git.info.filename>git.properties</git.info.filename>
|
||||
<registry.url>10.230.238.56:5000</registry.url>
|
||||
<!-- <registry.url>rh8-vm3.nbki.msk:5000</registry.url>-->
|
||||
</properties>
|
||||
<properties>
|
||||
<java.version>17</java.version>
|
||||
<git.info.prefix>git_info</git.info.prefix>
|
||||
<git.info.filename>git.properties</git.info.filename>
|
||||
<registry.url>rh8-vm3.nbki.msk:5000</registry.url>
|
||||
<!-- <registry.url>rh8-vm3.nbki.msk:5000</registry.url>-->
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>3.0.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ibm.db2</groupId>
|
||||
<artifactId>jcc</artifactId>
|
||||
<version>12.1.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>2.0.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.4.12</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
<version>1.5.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.17.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.18.0</version>
|
||||
</dependency>
|
||||
<!-- JAXB API -->
|
||||
<dependency>
|
||||
<groupId>jakarta.xml.bind</groupId>
|
||||
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||
<version>4.0.2</version>
|
||||
</dependency>
|
||||
<!--JAXB runtime implementation: eclipse moxy-->
|
||||
<dependency>
|
||||
<groupId>org.eclipse.persistence</groupId>
|
||||
<artifactId>org.eclipse.persistence.moxy</artifactId>
|
||||
<version>4.0.2</version>
|
||||
</dependency>
|
||||
<!-- Activation dependency needed for JAXB -->
|
||||
<dependency>
|
||||
<groupId>com.sun.activation</groupId>
|
||||
<artifactId>jakarta.activation</artifactId>
|
||||
<version>2.0.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>co.elastic.apm</groupId>
|
||||
<artifactId>apm-agent-api</artifactId>
|
||||
<version>1.43.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.internetitem</groupId>
|
||||
<artifactId>logback-elasticsearch-appender</artifactId>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.logstash.logback</groupId>
|
||||
<artifactId>logstash-logback-encoder</artifactId>
|
||||
<version>7.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter-test</artifactId>
|
||||
<version>3.0.4</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-junit-jupiter</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>3.0.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ibm.db2</groupId>
|
||||
<artifactId>jcc</artifactId>
|
||||
<version>12.1.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>2.0.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.4.12</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
<version>1.5.12</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.17.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.18.0</version>
|
||||
</dependency>
|
||||
<!-- JAXB API -->
|
||||
<dependency>
|
||||
<groupId>jakarta.xml.bind</groupId>
|
||||
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||
<version>4.0.2</version>
|
||||
</dependency>
|
||||
<!--JAXB runtime implementation: eclipse moxy-->
|
||||
<dependency>
|
||||
<groupId>org.eclipse.persistence</groupId>
|
||||
<artifactId>org.eclipse.persistence.moxy</artifactId>
|
||||
<version>4.0.2</version>
|
||||
</dependency>
|
||||
<!-- Activation dependency needed for JAXB -->
|
||||
<dependency>
|
||||
<groupId>com.sun.activation</groupId>
|
||||
<artifactId>jakarta.activation</artifactId>
|
||||
<version>2.0.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>co.elastic.apm</groupId>
|
||||
<artifactId>apm-agent-api</artifactId>
|
||||
<version>1.43.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.internetitem</groupId>
|
||||
<artifactId>logback-elasticsearch-appender</artifactId>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.logstash.logback</groupId>
|
||||
<artifactId>logstash-logback-encoder</artifactId>
|
||||
<version>7.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter-test</artifactId>
|
||||
<version>3.0.4</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>docker-push-dev</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>io.fabric8</groupId>
|
||||
<artifactId>docker-maven-plugin</artifactId>
|
||||
<version>0.45.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>Build and deploy docker container</id>
|
||||
<phase>install</phase>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
<goal>push</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<images>
|
||||
<image>
|
||||
<name>${project.artifactId}:${project.version}</name>
|
||||
<registry>${registry.url}</registry>
|
||||
<build>
|
||||
<dockerFile>${project.basedir}/Dockerfile</dockerFile>
|
||||
<assembly>
|
||||
<inline>
|
||||
<files>
|
||||
<file>
|
||||
<source>
|
||||
${project.build.directory}/${project.build.finalName}.jar
|
||||
</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>
|
||||
${project.basedir}/apm-agent/elastic-apm-agent-1.45.0.jar
|
||||
</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/start-credit-tracker.sh</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/credit-tracker.properties</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/monitoring-request.xsd</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/signal-package.xsd</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>
|
||||
${project.basedir}/ca_nbki.cer
|
||||
</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
</files>
|
||||
</inline>
|
||||
</assembly>
|
||||
<tags>
|
||||
<tag>${project.version}</tag>
|
||||
</tags>
|
||||
</build>
|
||||
</image>
|
||||
</images>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
<build>
|
||||
<finalName>credit-tracker</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>pl.project13.maven</groupId>
|
||||
<artifactId>git-commit-id-plugin</artifactId>
|
||||
<version>4.9.10</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>get-the-git-infos</id>
|
||||
<goals>
|
||||
<goal>revision</goal>
|
||||
</goals>
|
||||
<phase>compile</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<failOnNoGitDirectory>false</failOnNoGitDirectory>
|
||||
<dotGitDirectory>${project.basedir}/${git.info.relative.dir}</dotGitDirectory>
|
||||
<generateGitPropertiesFile>true</generateGitPropertiesFile>
|
||||
<generateGitPropertiesFilename>
|
||||
${project.build.outputDirectory}/${git.info.filename}
|
||||
</generateGitPropertiesFilename>
|
||||
<prefix>${git.info.prefix}</prefix>
|
||||
<includeOnlyProperties>
|
||||
<includeOnlyProperty>${git.info.prefix}.commit.id</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.branch</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.build.version</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.build.time</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.closest.tag.name</includeOnlyProperty>
|
||||
</includeOnlyProperties>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
<build>
|
||||
<finalName>credit-tracker</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>pl.project13.maven</groupId>
|
||||
<artifactId>git-commit-id-plugin</artifactId>
|
||||
<version>4.9.10</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>get-the-git-infos</id>
|
||||
<goals>
|
||||
<goal>revision</goal>
|
||||
</goals>
|
||||
<phase>compile</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<failOnNoGitDirectory>false</failOnNoGitDirectory>
|
||||
<dotGitDirectory>${project.basedir}/${git.info.relative.dir}</dotGitDirectory>
|
||||
<generateGitPropertiesFile>true</generateGitPropertiesFile>
|
||||
<generateGitPropertiesFilename>
|
||||
${project.build.outputDirectory}/${git.info.filename}
|
||||
</generateGitPropertiesFilename>
|
||||
<prefix>${git.info.prefix}</prefix>
|
||||
<includeOnlyProperties>
|
||||
<includeOnlyProperty>${git.info.prefix}.commit.id</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.branch</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.build.version</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.build.time</includeOnlyProperty>
|
||||
<includeOnlyProperty>${git.info.prefix}.closest.tag.name</includeOnlyProperty>
|
||||
</includeOnlyProperties>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>io.fabric8</groupId>
|
||||
<artifactId>docker-maven-plugin</artifactId>
|
||||
<version>0.45.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>Build and deploy docker container</id>
|
||||
<phase>install</phase>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
<goal>push</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<images>
|
||||
<image>
|
||||
<name>${project.artifactId}:${project.version}</name>
|
||||
<registry>${registry.url}</registry>
|
||||
<build>
|
||||
<dockerFile>${project.basedir}/Dockerfile</dockerFile>
|
||||
<assembly>
|
||||
<inline>
|
||||
<files>
|
||||
<file>
|
||||
<source>${project.build.directory}/${project.build.finalName}.jar</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/apm-agent/elastic-apm-agent-1.45.0.jar</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/start-credit-tracker.sh</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/credit-tracker.properties</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/monitoring-request.xsd</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>${project.basedir}/signal-package.xsd</source>
|
||||
<outputDirectory>.</outputDirectory>
|
||||
</file>
|
||||
</files>
|
||||
</inline>
|
||||
</assembly>
|
||||
<tags>
|
||||
<tag>${project.version}</tag>
|
||||
</tags>
|
||||
</build>
|
||||
</image>
|
||||
</images>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ public class CreditTrackerApplication {
|
|||
UpdateProcessingPackagesService updateProcessingPackagesService = ctx.getBean(UpdateProcessingPackagesService.class);
|
||||
MonitoringService monitoringService = ctx.getBean(MonitoringService.class);
|
||||
UpdatingFlagsService updatingFlagsService = ctx.getBean(UpdatingFlagsService.class);
|
||||
updateProcessingPackagesService.run();
|
||||
monitoringService.run();
|
||||
updatingFlagsService.run();
|
||||
updateProcessingPackagesService.run();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,13 @@ import ru.nbch.credit_tracker.entities.external_request.signals.Person;
|
|||
import ru.nbch.credit_tracker.service.indic.PersonService;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
@Slf4j
|
||||
public class PersonFactoryBuilder {
|
||||
private final static DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd.MM.yyyy");
|
||||
private final static DateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy");
|
||||
|
||||
private final static String DEFAULT_DATE = "01.01.2000";
|
||||
private final static String IP = "0";
|
||||
|
|
@ -30,7 +31,7 @@ public class PersonFactoryBuilder {
|
|||
|
||||
|
||||
private PersonService.PersonData personData;
|
||||
private Long uid;
|
||||
private Integer uid;
|
||||
|
||||
public static PersonFactoryBuilder builder() {
|
||||
return new PersonFactoryBuilder();
|
||||
|
|
@ -41,7 +42,7 @@ public class PersonFactoryBuilder {
|
|||
return this;
|
||||
}
|
||||
|
||||
public PersonFactoryBuilder uid(Long uid) {
|
||||
public PersonFactoryBuilder uid(Integer uid) {
|
||||
this.uid = uid;
|
||||
return this;
|
||||
}
|
||||
|
|
@ -56,10 +57,10 @@ public class PersonFactoryBuilder {
|
|||
person.setS(nameData.getLastName());
|
||||
person.setN(nameData.getFirstName());
|
||||
person.setM(StringUtils.isNotBlank(nameData.getMiddleName()) ? nameData.getMiddleName() : null);
|
||||
person.setD(DATE_FORMAT.format(nameData.getBirthDate()));
|
||||
person.setD(DATE_FORMAT.format(CTUtil.localDatetoDate(nameData.getBirthDate())));
|
||||
|
||||
person.setPn(getPn(passportData.getSerNum(), passportData.getIdNum()));
|
||||
person.setPd(DATE_FORMAT.format(LocalDate.now())); // Do not use passport iss_date. Signal service could reject the package
|
||||
person.setPd(DATE_FORMAT.format(CTUtil.localDatetoDate(LocalDate.now()))); // Do not use passport iss_date. Signal service could reject the package
|
||||
person.setDt(getDt(passportData.getIdType(), passportData.getIdType2()));
|
||||
if (person.getDt() != null && person.getDt().equals("999")) {
|
||||
person.setOdt(ODT);
|
||||
|
|
@ -68,12 +69,12 @@ public class PersonFactoryBuilder {
|
|||
person.setIp(IP);
|
||||
person.setUid(uid);
|
||||
person.setOksm(OKSM);
|
||||
person.setConsentDate(DATE_FORMAT.format(LocalDate.now()));
|
||||
person.setConsentDate(DATE_FORMAT.format(CTUtil.localDatetoDate(LocalDate.now())));
|
||||
person.setConsentPurpose(CONSENT_PURPOSE);
|
||||
person.setReportUser(REPORT_USER);
|
||||
person.setLiability(LIABILITY);
|
||||
person.setConsentPeriod(CONSENT_PERIOD);
|
||||
person.setAgrDate(DATE_FORMAT.format(LocalDate.now()));
|
||||
person.setAgrDate(DATE_FORMAT.format(CTUtil.localDatetoDate(LocalDate.now())));
|
||||
person.setReportUserRegNum(REPORT_USER_REG_NUM);
|
||||
person.setReportUserTaxID(REPORT_USER_TAX_ID);
|
||||
person.setConsentHash(CONSENT_HASH);
|
||||
|
|
|
|||
|
|
@ -1,28 +0,0 @@
|
|||
package ru.nbch.credit_tracker.component;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Aspect
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MapperTimingAspect {
|
||||
@Around("within(@org.apache.ibatis.annotations.Mapper *)")
|
||||
public Object timeMapper(ProceedingJoinPoint pjp) throws Throwable {
|
||||
long start = System.nanoTime();
|
||||
try {
|
||||
return pjp.proceed();
|
||||
} finally {
|
||||
long tookMs = (System.nanoTime() - start) / 1_000_000;
|
||||
String method = pjp.getSignature().toShortString();
|
||||
if (tookMs > 1000) {
|
||||
log.warn("Slow mapper call {} took {} ms", method, tookMs);
|
||||
} else {
|
||||
log.debug("Mapper call {} took {} ms", method, tookMs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,18 @@
|
|||
package ru.nbch.credit_tracker.config.datasource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.springframework.boot.jdbc.DataSourceBuilder;
|
||||
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
public class DatabaseConfig {
|
||||
|
||||
protected HikariDataSource createDataSource(DataSourceSettings settings) {
|
||||
protected DataSource createDataSource(DataSourceSettings settings) {
|
||||
return DataSourceBuilder.create()
|
||||
.driverClassName(settings.driver())
|
||||
.url(settings.url())
|
||||
.username(settings.username())
|
||||
.password(settings.password())
|
||||
.type(HikariDataSource.class)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package ru.nbch.credit_tracker.config.datasource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||
|
|
@ -11,7 +10,6 @@ import org.springframework.context.annotation.Bean;
|
|||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.Resource;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
|
|
@ -30,25 +28,14 @@ public class IndicDataSourceConfig extends DatabaseConfig {
|
|||
|
||||
@Bean(name = "indicDataSource")
|
||||
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
||||
DataSourceSettings indicSetings = config.getIndicDataSourceSettings();
|
||||
|
||||
HikariDataSource dataSource = createDataSource(indicSetings);
|
||||
dataSource.setMaximumPoolSize(indicSetings.maximumPoolSize());
|
||||
dataSource.setMinimumIdle(indicSetings.minimumIdle());
|
||||
dataSource.setConnectionTimeout(indicSetings.connectionTimeout());
|
||||
dataSource.setValidationTimeout(indicSetings.validationTimeout());
|
||||
dataSource.setIdleTimeout(indicSetings.idleTimeout());
|
||||
dataSource.setMaxLifetime(indicSetings.maxLifetime());
|
||||
dataSource.setKeepaliveTime(indicSetings.keepaliveTime());
|
||||
dataSource.setLeakDetectionThreshold(indicSetings.leakDetectionThreshold());
|
||||
|
||||
DataSource dataSource = createDataSource(config.getIndicDataSourceSettings());
|
||||
try (Connection connection = dataSource.getConnection()) {
|
||||
connection.isValid(3);
|
||||
} catch (SQLException e) {
|
||||
log.error("Unable to connect to Indic url={}", indicSetings.url(), e);
|
||||
log.error("Unable to connect to Indic url={}", config.getIndicDataSourceSettings().url(), e);
|
||||
throw e;
|
||||
}
|
||||
log.info("Connected to Indic: url={}", indicSetings.url());
|
||||
log.info("Connected to Indic: url={}", config.getIndicDataSourceSettings().url());
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package ru.nbch.credit_tracker.config.datasource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||
|
|
@ -11,7 +10,6 @@ import org.springframework.context.annotation.Bean;
|
|||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.Resource;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
|
|
@ -30,25 +28,14 @@ public class ScoringDataSourceConfig extends DatabaseConfig {
|
|||
|
||||
@Bean(name = "scoringDataSource")
|
||||
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
||||
DataSourceSettings scoringSetings = config.getScoringDataSourceSettings();
|
||||
|
||||
HikariDataSource dataSource = createDataSource(scoringSetings);
|
||||
dataSource.setMaximumPoolSize(scoringSetings.maximumPoolSize());
|
||||
dataSource.setMinimumIdle(scoringSetings.minimumIdle());
|
||||
dataSource.setConnectionTimeout(scoringSetings.connectionTimeout());
|
||||
dataSource.setValidationTimeout(scoringSetings.validationTimeout());
|
||||
dataSource.setIdleTimeout(scoringSetings.idleTimeout());
|
||||
dataSource.setMaxLifetime(scoringSetings.maxLifetime());
|
||||
dataSource.setKeepaliveTime(scoringSetings.keepaliveTime());
|
||||
dataSource.setLeakDetectionThreshold(scoringSetings.leakDetectionThreshold());
|
||||
|
||||
DataSource dataSource = createDataSource(config.getScoringDataSourceSettings());
|
||||
try (Connection connection = dataSource.getConnection()) {
|
||||
connection.isValid(3);
|
||||
} catch (SQLException e) {
|
||||
log.error("Unable to connect to Scoring url={}", scoringSetings.url(), e);
|
||||
log.error("Unable to connect to Scoring url={}", config.getScoringDataSourceSettings().url(), e);
|
||||
throw e;
|
||||
}
|
||||
log.info("Connected to Scoring: url={}", scoringSetings.url());
|
||||
log.info("Connected to Scoring: url={}", config.getScoringDataSourceSettings().url());
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package ru.nbch.credit_tracker.config.datasource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||
|
|
@ -11,7 +10,6 @@ import org.springframework.context.annotation.Bean;
|
|||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.Resource;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
|
|
@ -29,25 +27,14 @@ public class SignalDataSourceConfig extends DatabaseConfig {
|
|||
|
||||
@Bean(name = "signalDataSource")
|
||||
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
||||
DataSourceSettings signalSetings = config.getSignalDataSourceSettings();
|
||||
|
||||
HikariDataSource dataSource = createDataSource(signalSetings);
|
||||
dataSource.setMaximumPoolSize(signalSetings.maximumPoolSize());
|
||||
dataSource.setMinimumIdle(signalSetings.minimumIdle());
|
||||
dataSource.setConnectionTimeout(signalSetings.connectionTimeout());
|
||||
dataSource.setValidationTimeout(signalSetings.validationTimeout());
|
||||
dataSource.setIdleTimeout(signalSetings.idleTimeout());
|
||||
dataSource.setMaxLifetime(signalSetings.maxLifetime());
|
||||
dataSource.setKeepaliveTime(signalSetings.keepaliveTime());
|
||||
dataSource.setLeakDetectionThreshold(signalSetings.leakDetectionThreshold());
|
||||
|
||||
DataSource dataSource = createDataSource(config.getSignalDataSourceSettings());
|
||||
try (Connection connection = dataSource.getConnection()) {
|
||||
connection.isValid(3);
|
||||
} catch (SQLException e) {
|
||||
log.error("Unable to connect to Signal url={}", signalSetings.url(), e);
|
||||
log.error("Unable to connect to Signal url={}", config.getSignalDataSourceSettings().url(), e);
|
||||
throw e;
|
||||
}
|
||||
log.info("Connected to Signal: url={}", signalSetings.url());
|
||||
log.info("Connected to Signal: url={}", config.getSignalDataSourceSettings().url());
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.mdc;
|
||||
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnClass(Aspect.class)
|
||||
@EnableAspectJAutoProxy(proxyTargetClass = true)
|
||||
public class AopMdcConfig {
|
||||
|
||||
@Bean
|
||||
public MdcAspect mdcAspect() {
|
||||
return new MdcAspect();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.mdc;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.slf4j.MDC;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
|
||||
@Slf4j
|
||||
@Aspect
|
||||
public class MdcAspect {
|
||||
|
||||
// For methods that set an MDC value (from a method argument) and then clear it at the end
|
||||
@Around("@annotation(setAndClearMdc)")
|
||||
public Object setAndClearMdcAdvice(ProceedingJoinPoint pjp, SetAndClearMdc setAndClearMdc) throws Throwable {
|
||||
Object[] args = pjp.getArgs();
|
||||
int index = setAndClearMdc.argIndex();
|
||||
Object obj = (args != null && args.length > index) ? args[index] : null;
|
||||
if (obj instanceof MonitoringRequest request) {
|
||||
if (request.getPackageName() != null) {
|
||||
putMdcValue(setAndClearMdc.key(), request.getPackageName());
|
||||
}
|
||||
} else if (obj instanceof UserPackage userPackage) {
|
||||
if (userPackage.getPackageName() != null) {
|
||||
putMdcValue(setAndClearMdc.key(), userPackage.getPackageName());
|
||||
}
|
||||
} else if (obj instanceof String packageName) {
|
||||
putMdcValue(setAndClearMdc.key(), packageName);
|
||||
} else {
|
||||
log.debug("no packageName found for for {}", pjp.toShortString());
|
||||
}
|
||||
try {
|
||||
return pjp.proceed();
|
||||
} finally {
|
||||
MDC.remove(setAndClearMdc.key());
|
||||
}
|
||||
}
|
||||
|
||||
private void putMdcValue(String key, String value) {
|
||||
try {
|
||||
MDC.put(key, "[" + value + "] ");
|
||||
} catch (Throwable e) {
|
||||
log.error("{}", ExceptionUtils.getStackTrace(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.mdc;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
// Annotation to set an MDC key based on a method argument and clear it after method execution
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface SetAndClearMdc {
|
||||
String key() default "ru.nbch.credit_tracker.log.mdc.key";
|
||||
// The index of the method argument to use for the MDC value (defaults to the first argument)
|
||||
int argIndex() default 0;
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
package ru.nbch.credit_tracker.config.rest;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
|
|
@ -13,12 +12,10 @@ import ru.nbch.credit_tracker.entities.user_response.errors.*;
|
|||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalException;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalServerException;
|
||||
import ru.nbch.credit_tracker.utils.error.SimpleMessageResolver;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
@Slf4j
|
||||
@RestControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
|
|
@ -46,25 +43,14 @@ public class GlobalExceptionHandler {
|
|||
public ResponseEntity<CommonError> handleClientException(SignalException ex) {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding)));
|
||||
|
||||
String errorText = messageResolver.resolve(ex.getErrorMessage());
|
||||
|
||||
CommonError commonError = getCommonError(ex);
|
||||
commonError.setStatus("error");
|
||||
commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode());
|
||||
commonError.setErrorText(errorText);
|
||||
commonError.setErrorText(messageResolver.resolve(ex.getErrorMessage()));
|
||||
|
||||
if (ex instanceof SignalClientException) {
|
||||
String packageName = ((SignalClientException) ex).getPackageName();
|
||||
if(packageName != null ) {
|
||||
log.warn("Response error: {}. PackageName: {}", errorText, packageName);
|
||||
} else {
|
||||
log.warn("Response error: {}", errorText);
|
||||
}
|
||||
return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST);
|
||||
} else {
|
||||
Exception cause = ((SignalServerException) ex).getCause();
|
||||
log.error(cause.getMessage(), cause);
|
||||
return new ResponseEntity<>(commonError, headers, HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
|
|
@ -74,7 +60,6 @@ public class GlobalExceptionHandler {
|
|||
switch (ex.getErrorFormat()) {
|
||||
case MonitoringError -> commonError = new MonitoringError();
|
||||
case MonitoringActivePackagesError -> commonError = new MonitoringActivePackagesError();
|
||||
case MonitoringAllPackagesError -> commonError = new MonitoringAllPackagesError();
|
||||
case MonitoringDownloadError -> commonError = new MonitoringDownloadError();
|
||||
case MonitoringReportListError -> commonError = new MonitoringReportListError();
|
||||
case MonitoringPackageDeleteError -> commonError = new MonitoringPackageDeleteError();
|
||||
|
|
|
|||
|
|
@ -1,132 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.rest.filters;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.Part;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
import org.springframework.web.util.ContentCachingRequestWrapper;
|
||||
import org.springframework.web.util.ContentCachingResponseWrapper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
@Order(0)
|
||||
public class HttpLoggingFilter extends OncePerRequestFilter {
|
||||
|
||||
private static final Set<String> SENSITIVE_HEADERS = Set.of("authorization", "cookie", "set-cookie");
|
||||
private static final int MAX_BODY = 10 * 1024;
|
||||
|
||||
@Override
|
||||
protected boolean shouldNotFilter(HttpServletRequest request) {
|
||||
String path = request.getRequestURI();
|
||||
return path.startsWith("/actuator/health") || path.startsWith("/swagger")
|
||||
|| path.startsWith("/v3/api-docs") || path.startsWith("/static/") || path.equals("/");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
||||
throws ServletException, IOException {
|
||||
|
||||
long startNs = System.nanoTime();
|
||||
|
||||
ContentCachingRequestWrapper req = wrapRequest(request);
|
||||
ContentCachingResponseWrapper resp = new ContentCachingResponseWrapper(response);
|
||||
|
||||
String correlationId = Optional.ofNullable(request.getHeader("X-Correlation-Id"))
|
||||
.filter(StringUtils::hasText)
|
||||
.orElse(UUID.randomUUID().toString());
|
||||
resp.setHeader("X-Correlation-Id", correlationId);
|
||||
|
||||
logIncomingRequest(req, correlationId);
|
||||
|
||||
try {
|
||||
chain.doFilter(req, resp);
|
||||
} finally {
|
||||
long tookMs = (System.nanoTime() - startNs) / 1_000_000;
|
||||
|
||||
Map<String, String> reqParams = paramsMap(req);
|
||||
|
||||
Map<String, String> reqHeaders = headersMap(req);
|
||||
Map<String, String> respHeaders = headersMap(resp);
|
||||
|
||||
mask(reqHeaders);
|
||||
mask(respHeaders);
|
||||
|
||||
log.info(
|
||||
"HTTP (RESPONSE) {} {} | status={} | took={}ms | cid={} | reqHeaders={} | reqParams={} | respHeaders={}",
|
||||
req.getMethod(),
|
||||
req.getRequestURI(),
|
||||
resp.getStatus(),
|
||||
tookMs,
|
||||
correlationId,
|
||||
reqHeaders,
|
||||
reqParams,
|
||||
respHeaders
|
||||
);
|
||||
|
||||
resp.copyBodyToResponse();
|
||||
}
|
||||
}
|
||||
|
||||
private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) {
|
||||
Map<String, String> reqParams = paramsMap(req);
|
||||
Map<String, String> reqHeaders = headersMap(req);
|
||||
mask(reqHeaders);
|
||||
|
||||
log.info(
|
||||
"HTTP (REQUEST) {} {} | cid={} | reqHeaders={} | reqParams={}",
|
||||
req.getMethod(),
|
||||
req.getRequestURI(),
|
||||
correlationId,
|
||||
reqHeaders,
|
||||
reqParams
|
||||
);
|
||||
}
|
||||
|
||||
private static ContentCachingRequestWrapper wrapRequest(HttpServletRequest request) throws IOException {
|
||||
return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY);
|
||||
}
|
||||
|
||||
|
||||
private static Map<String, String> headersMap(HttpServletRequest req) {
|
||||
return Collections.list(req.getHeaderNames()).stream()
|
||||
.collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new));
|
||||
}
|
||||
|
||||
private static Map<String, String> paramsMap(HttpServletRequestWrapper req) {
|
||||
Map<String, String> paramsMap = new LinkedHashMap<>();
|
||||
req.getParameterMap().forEach((k, v) -> {
|
||||
String params = String.join(", ", v);
|
||||
paramsMap.put(k, params);
|
||||
});
|
||||
|
||||
try {
|
||||
Collection<Part> fileParts = req.getParts();
|
||||
fileParts.forEach(part -> {
|
||||
paramsMap.put(part.getName(), part.getSubmittedFileName());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
return paramsMap;
|
||||
}
|
||||
|
||||
private static Map<String, String> headersMap(HttpServletResponse resp) {
|
||||
return resp.getHeaderNames().stream()
|
||||
.collect(Collectors.toMap(h -> h, resp::getHeader, (a, b) -> a, LinkedHashMap::new));
|
||||
}
|
||||
|
||||
private static void mask(Map<String, String> headers) {
|
||||
headers.replaceAll((k, v) -> SENSITIVE_HEADERS.contains(k.toLowerCase()) ? "***" : v);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.rest.filters;
|
||||
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
import ru.nbch.credit_tracker.config.rest.wrappers.CachedHttpRequestWrapper;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
@Order(1)
|
||||
public class MemberCodeHttpLoggingFilter extends OncePerRequestFilter {
|
||||
|
||||
@Override
|
||||
protected boolean shouldNotFilter(HttpServletRequest request) {
|
||||
String path = request.getRequestURI();
|
||||
return !(path.startsWith("/api/v1/signal/all_packages") || path.startsWith("/api/v1/signal/active_packages"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||
CachedHttpRequestWrapper req = wrapRequest(request);
|
||||
String body = IOUtils.toString(req.getBody(), req.getCharacterEncoding());
|
||||
if (StringUtils.isNotBlank(body)) {
|
||||
try {
|
||||
int startIndex = body.indexOf("<UserId>") + 8;
|
||||
int endIndex = body.indexOf("</UserId>");
|
||||
String userId = body.substring(startIndex, endIndex);
|
||||
log.info(
|
||||
"HTTP (REQUEST) {} {} | memberCode={}",
|
||||
req.getMethod(),
|
||||
req.getRequestURI(),
|
||||
userId.substring(0, 6)
|
||||
);
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
filterChain.doFilter(req, response);
|
||||
}
|
||||
|
||||
private static CachedHttpRequestWrapper wrapRequest(HttpServletRequest request) throws IOException {
|
||||
return new CachedHttpRequestWrapper(request);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.rest.wrappers;
|
||||
|
||||
import jakarta.servlet.ServletInputStream;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Getter
|
||||
public class CachedHttpRequestWrapper extends HttpServletRequestWrapper {
|
||||
private final byte[] body;
|
||||
|
||||
|
||||
public CachedHttpRequestWrapper(HttpServletRequest request) throws IOException {
|
||||
super(request);
|
||||
this.body = request.getInputStream().readAllBytes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServletInputStream getInputStream() {
|
||||
return new CachedServletInputStream(body);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package ru.nbch.credit_tracker.config.rest.wrappers;
|
||||
|
||||
import jakarta.servlet.ReadListener;
|
||||
import jakarta.servlet.ServletInputStream;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
|
||||
public class CachedServletInputStream extends ServletInputStream {
|
||||
|
||||
private final ByteArrayInputStream byteArray;
|
||||
|
||||
public CachedServletInputStream(byte[] data) {
|
||||
this.byteArray = new ByteArrayInputStream(data);
|
||||
}
|
||||
|
||||
public int read() {
|
||||
return byteArray.read();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFinished() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setReadListener(ReadListener listener) {
|
||||
}
|
||||
}
|
||||
|
|
@ -29,7 +29,7 @@ public class CreditTrackerSettings {
|
|||
private Long maxXmlFileSize;
|
||||
private String loadDir;
|
||||
private Long monitoringInterval;
|
||||
private String updateFlagsCronExpression;
|
||||
private Long updateFlagsInterval;
|
||||
private Long daysToUpdateFlags;
|
||||
|
||||
private String encoding;
|
||||
|
|
|
|||
|
|
@ -4,13 +4,5 @@ public record DataSourceSettings(
|
|||
String username,
|
||||
String password,
|
||||
String url,
|
||||
String driver,
|
||||
Integer maximumPoolSize,
|
||||
Integer minimumIdle,
|
||||
long connectionTimeout,
|
||||
long validationTimeout,
|
||||
long idleTimeout,
|
||||
long maxLifetime,
|
||||
long keepaliveTime,
|
||||
long leakDetectionThreshold
|
||||
String driver
|
||||
) {}
|
||||
|
|
@ -6,8 +6,6 @@ import org.springframework.context.annotation.Configuration;
|
|||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.external_response.monitoring_report_file.SgnlReportMonitorigSetupError;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_report.SgnlOnlineReport;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringError;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
|
||||
|
|
@ -28,8 +26,6 @@ public class XmlConfig {
|
|||
// unmarshalling classes
|
||||
SgnlOnlineReport.class,
|
||||
SgnlReportMonitorigSetupError.class,
|
||||
MonitoringActivePackagesRequest.class,
|
||||
MonitoringAllPackagesRequest.class,
|
||||
// marshalling classes
|
||||
MonitoringError.class,
|
||||
MonitoringSetupResponse.class);
|
||||
|
|
|
|||
|
|
@ -6,9 +6,7 @@ import org.springframework.http.ResponseEntity;
|
|||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringPackageDeleteResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportListResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
|
|
@ -34,11 +32,6 @@ public class SignalController {
|
|||
return signalFacade.findActivePackages(activePackagesRequest);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/all_packages", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(@RequestBody MonitoringAllPackagesRequest allPackagesRequest) {
|
||||
return signalFacade.findAllPackages(allPackagesRequest);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/delete", params = {"username", "packageName"}, produces = MediaType.APPLICATION_XML_VALUE)
|
||||
public ResponseEntity<MonitoringPackageDeleteResponse> deletePackage(@RequestParam("username") String username, @RequestParam("packageName") String packageName) {
|
||||
return signalFacade.deletePackage(username, packageName);
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ import java.time.LocalDateTime;
|
|||
@Getter
|
||||
@Setter
|
||||
public class Hit {
|
||||
private Long id;
|
||||
private Long packageId;
|
||||
private Integer id;
|
||||
private Integer packageId;
|
||||
private String subjectId;
|
||||
private Integer signalType;
|
||||
private LocalDateTime responseSentAt;
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ import java.time.LocalDateTime;
|
|||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class PhoneFidMap {
|
||||
private Long id;
|
||||
private Long packageId;
|
||||
private Integer id;
|
||||
private Integer packageId;
|
||||
private String subjectId;
|
||||
private String phone;
|
||||
private Integer fid;
|
||||
|
|
|
|||
|
|
@ -10,12 +10,10 @@ import java.time.LocalDateTime;
|
|||
@Setter
|
||||
@Builder
|
||||
public class UserPackage {
|
||||
private Long id;
|
||||
private Integer id;
|
||||
private String userId;
|
||||
private String packageName;
|
||||
private LocalDateTime createdAt;
|
||||
private String status;
|
||||
private LocalDateTime deactivatedAt;
|
||||
private String lastDownloadedReport;
|
||||
private LocalDateTime monitoringAt;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ public class Person {
|
|||
@XmlValue
|
||||
protected String value;
|
||||
@XmlAttribute(name = "uid", required = true)
|
||||
protected Long uid;
|
||||
protected Integer uid;
|
||||
@XmlAttribute(name = "oksm", required = true)
|
||||
protected String oksm;
|
||||
@XmlAttribute(name = "s", required = true)
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ public class MonitoringReportErrors {
|
|||
public static class P {
|
||||
|
||||
@XmlAttribute(name = "uid")
|
||||
protected Long uid;
|
||||
protected Integer uid;
|
||||
|
||||
@XmlValue
|
||||
protected String value;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import java.util.List;
|
|||
public class Person {
|
||||
|
||||
@XmlAttribute(name = "uid", required = true)
|
||||
protected Long uid;
|
||||
protected Integer uid;
|
||||
|
||||
@XmlElement(name = "Inquiry", required = true)
|
||||
protected List<Inquiry> inquiries;
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
package ru.nbch.credit_tracker.entities.user_request.all_packages;
|
||||
|
||||
import jakarta.xml.bind.annotation.*;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@XmlType(name = "", propOrder = {
|
||||
"userId",
|
||||
"password"
|
||||
})
|
||||
@XmlRootElement(name = "MonitoringAllPackagesRequest")
|
||||
public class MonitoringAllPackagesRequest {
|
||||
|
||||
@XmlElement(name = "UserId", required = true)
|
||||
protected String userId;
|
||||
@XmlElement(name = "Password", required = true)
|
||||
protected String password;
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
package ru.nbch.credit_tracker.entities.user_response.all_packages;
|
||||
|
||||
import jakarta.xml.bind.annotation.*;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@XmlType(name = "", propOrder = {
|
||||
"status",
|
||||
"membercode",
|
||||
"packages"
|
||||
})
|
||||
@XmlRootElement(name = "MonitoringAllPackagesResponse")
|
||||
public class MonitoringAllPackagesResponse {
|
||||
|
||||
@XmlElement(name = "Status", required = true)
|
||||
protected String status;
|
||||
@XmlElement(name = "Membercode", required = true)
|
||||
protected String membercode;
|
||||
@XmlElement(name = "Packages", required = true)
|
||||
protected PackagesAll packages;
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
package ru.nbch.credit_tracker.entities.user_response.all_packages;
|
||||
|
||||
import jakarta.xml.bind.annotation.XmlAccessType;
|
||||
import jakarta.xml.bind.annotation.XmlAccessorType;
|
||||
import jakarta.xml.bind.annotation.XmlElement;
|
||||
import jakarta.xml.bind.annotation.XmlType;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@XmlType(name = "", propOrder = {
|
||||
"packageName",
|
||||
"createdAt",
|
||||
"status",
|
||||
"deactivatedAt"
|
||||
})
|
||||
public class PackageAll {
|
||||
|
||||
@XmlElement(name = "PackageName", required = true)
|
||||
protected String packageName;
|
||||
@XmlElement(name = "CreatedAt", required = true)
|
||||
protected String createdAt;
|
||||
@XmlElement(name = "Status", required = false)
|
||||
protected String status;
|
||||
@XmlElement(name = "DeactivatedAt", required = false)
|
||||
protected String deactivatedAt;
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
package ru.nbch.credit_tracker.entities.user_response.all_packages;
|
||||
|
||||
import jakarta.xml.bind.annotation.XmlAccessType;
|
||||
import jakarta.xml.bind.annotation.XmlAccessorType;
|
||||
import jakarta.xml.bind.annotation.XmlElement;
|
||||
import jakarta.xml.bind.annotation.XmlType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@XmlType(name = "", propOrder = {
|
||||
"packages"
|
||||
})
|
||||
public class PackagesAll {
|
||||
|
||||
@XmlElement(name = "Package", required = true)
|
||||
protected List<PackageAll> packages;
|
||||
|
||||
public List<PackageAll> getPackages() {
|
||||
if (packages == null) {
|
||||
packages = new ArrayList<>();
|
||||
}
|
||||
return this.packages;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
package ru.nbch.credit_tracker.entities.user_response.errors;
|
||||
|
||||
import jakarta.xml.bind.annotation.*;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
@XmlType(name = "MonitoringAllPackagesResponse", propOrder = {
|
||||
"status",
|
||||
"errorCode",
|
||||
"errorText"
|
||||
})
|
||||
@XmlRootElement(name = "MonitoringAllPackagesResponse")
|
||||
public class MonitoringAllPackagesError implements CommonError {
|
||||
|
||||
@XmlElement(name = "Status", required = true)
|
||||
protected String status;
|
||||
@XmlElement(name = "Code",required = true)
|
||||
protected String errorCode;
|
||||
@XmlElement(name = "Message",required = true)
|
||||
protected String errorText;
|
||||
|
||||
}
|
||||
|
|
@ -2,27 +2,21 @@ package ru.nbch.credit_tracker.enums;
|
|||
|
||||
public enum SignalError implements IEnumKeyCode {
|
||||
ERROR_001("001", "Ошибка распаковки архива"),
|
||||
ERROR_002("002", "Отсутствует обязательный элемент: {}"),
|
||||
ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX. Id: {}"),
|
||||
ERROR_002("002", "Отсутствует обязательный элемент: "),
|
||||
ERROR_003("003", "Элемент ClientId не соответствует формату XXXXXXXXX"),
|
||||
ERROR_005("005", "Неверный логин или пароль"),
|
||||
ERROR_006("006", "Доступ к услуге закрыт, обратитесь к курирующему менеджеру"),
|
||||
ERROR_007("007", "В системе уже существует пакет с таким именем"),
|
||||
ERROR_008("008", "PackageName не соответствует допустимому формату"),
|
||||
ERROR_009("009", "Превышен допустимый размер пакета"),
|
||||
ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату: {}"),
|
||||
ERROR_010("010", "Идентификатор субъекта (Id) не соответствует допустимому формату"),
|
||||
ERROR_011("011", "Получен невалидный XML"),
|
||||
ERROR_012("012", "Пакет {} не найден"),
|
||||
ERROR_012("012", "Пакет не найден"),
|
||||
ERROR_013("013", "На стороне сервиса произошла ошибка, попробуйте повторить запрос позже или сообщите в техническую поддержку"),
|
||||
ERROR_014("014", "Файл с именем {} не найден "),
|
||||
ERROR_014("014", "Файл не найден"),
|
||||
ERROR_015("015", "У данного пользователя не найдено активных пакетов"),
|
||||
ERROR_016("016", "Нет активного пакета с именем {}"),
|
||||
ERROR_017("017", "При обработке запроса произошла ошибка. Повторите запрос позже или обратитесь в службу технической поддержки"), // TODO get rid of duplicate?
|
||||
ERROR_018("018", "Пакет {} находится в обработке. Дождитесь его установки на мониторинг и повторите попытку позже."),
|
||||
ERROR_019("019", "У данного пользователя не найдено ни одного пакета"),
|
||||
ERROR_020("020", "Пакет {} был отклонён при установке на мониторинг. Отчеты не формируются."),
|
||||
ERROR_021("021", "Обработка пакета {} завершилась с ошибкой, отчёты недоступны. Обратитесь в техническую поддержку."),
|
||||
ERROR_022("022", "Пакет {} снят с мониторинга, отчёты больше недоступны.");
|
||||
|
||||
ERROR_016("016", "Нет активного пакета с именем "),
|
||||
ERROR_017("017", "При обработке запроса произошла ошибка. Повторите запрос позже или обратитесь в службу технической поддержки"); // TODO get rid of duplicate?
|
||||
|
||||
private final String code;
|
||||
private final String message;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package ru.nbch.credit_tracker.enums;
|
|||
|
||||
public enum XmlErrorFormat {
|
||||
MonitoringActivePackagesError,
|
||||
MonitoringAllPackagesError,
|
||||
MonitoringDownloadError,
|
||||
MonitoringError,
|
||||
MonitoringPackageDeleteError,
|
||||
|
|
|
|||
|
|
@ -7,10 +7,7 @@ import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
|||
@Getter
|
||||
public class SignalClientException extends SignalException {
|
||||
|
||||
private final String packageName;
|
||||
|
||||
public SignalClientException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat, String packageName) {
|
||||
public SignalClientException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat) {
|
||||
super(errorMessage, errorFormat);
|
||||
this.packageName = packageName;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,17 +1,12 @@
|
|||
package ru.nbch.credit_tracker.exceptions;
|
||||
|
||||
import lombok.Getter;
|
||||
import ru.nbch.credit_tracker.enums.EnumKeyMessage;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
|
||||
@Getter
|
||||
public class SignalServerException extends SignalException {
|
||||
|
||||
private final Exception cause;
|
||||
|
||||
public SignalServerException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat, Exception cause) {
|
||||
public SignalServerException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat) {
|
||||
super(errorMessage, errorFormat);
|
||||
this.cause = cause;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,27 +1,20 @@
|
|||
package ru.nbch.credit_tracker.facade;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import org.springframework.core.io.FileUrlResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.MonitoringActivePackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.Package;
|
||||
import ru.nbch.credit_tracker.entities.user_response.active_packages.Packages;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.MonitoringAllPackagesResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackageAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.all_packages.PackagesAll;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringPackageDeleteResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringReportListResponse;
|
||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||
|
|
@ -29,13 +22,12 @@ import ru.nbch.credit_tracker.enums.SignalError;
|
|||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
||||
import ru.nbch.credit_tracker.service.MonitoringErrorProcesingService;
|
||||
import ru.nbch.credit_tracker.service.SignalService;
|
||||
import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
import ru.nbch.credit_tracker.utils.ValidationService;
|
||||
import ru.nbch.credit_tracker.utils.ValidationUtil;
|
||||
import ru.nbch.credit_tracker.utils.ZipUtils;
|
||||
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
|
|
@ -47,7 +39,6 @@ import java.nio.file.Files;
|
|||
import java.nio.file.Path;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
|
@ -59,17 +50,11 @@ import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp;
|
|||
|
||||
@Slf4j
|
||||
@Service
|
||||
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||
public class SignalFacade {
|
||||
|
||||
private SignalFacade self;
|
||||
|
||||
private final CreditTrackerSettings config;
|
||||
private final AuthorizationService authorizationService;
|
||||
private final SignalService signalService;
|
||||
private final SignalRestService signalRestService;
|
||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||
private final ValidationService validationService;
|
||||
private final StaxXmlProcessor staxXmlProcessor;
|
||||
|
||||
private final ExecutorService executor;
|
||||
|
|
@ -80,16 +65,12 @@ public class SignalFacade {
|
|||
AuthorizationService authorizationService,
|
||||
SignalService signalService,
|
||||
SignalRestService signalRestService,
|
||||
MonitoringErrorProcesingService monitoringErrorProcesingService,
|
||||
ValidationService validationService,
|
||||
StaxXmlProcessor staxXmlProcessor,
|
||||
@Qualifier("executorService") ExecutorService executor) {
|
||||
this.config = config;
|
||||
this.authorizationService = authorizationService;
|
||||
this.signalService = signalService;
|
||||
this.signalRestService = signalRestService;
|
||||
this.monitoringErrorProcesingService = monitoringErrorProcesingService;
|
||||
this.validationService = validationService;
|
||||
this.staxXmlProcessor = staxXmlProcessor;
|
||||
this.executor = executor;
|
||||
this.maxXmlFileSize = config.getMaxXmlFileSize() * 1024 * 1024;
|
||||
|
|
@ -103,7 +84,7 @@ public class SignalFacade {
|
|||
|
||||
// Валидация Архива на количетсво файлов, размер и расширение
|
||||
MonitoringRequest monitoringRequest;
|
||||
Long packageId;
|
||||
Integer packageId;
|
||||
ZipInputStream zipInputStream = null;
|
||||
String filePath;
|
||||
try {
|
||||
|
|
@ -121,17 +102,21 @@ public class SignalFacade {
|
|||
zipInputStream.getNextEntry();
|
||||
|
||||
filePath = writeTmpFile(zipInputStream);
|
||||
if (filePath == null) {
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
|
||||
} finally {
|
||||
if (zipInputStream != null) {
|
||||
try {
|
||||
zipInputStream.close();
|
||||
} catch (IOException e) {
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -148,7 +133,8 @@ public class SignalFacade {
|
|||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
@ -156,27 +142,27 @@ public class SignalFacade {
|
|||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(monitoringRequest.getUserId(), monitoringRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
signalService.rejectPackage(monitoringRequest);
|
||||
throw clientExcp(authResult.getError(), monitoringRequest.getPackageName(), XmlErrorFormat.MonitoringError);
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
// проверка на уникальность пакета
|
||||
if (signalService.isPackageNotUnique(monitoringRequest)) {
|
||||
signalService.rejectPackage(monitoringRequest);
|
||||
throw clientExcp(SignalError.ERROR_007, monitoringRequest.getPackageName(), XmlErrorFormat.MonitoringError);
|
||||
throw clientExcp(SignalError.ERROR_007, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
packageId = signalService.registerPackage(monitoringRequest);
|
||||
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name());
|
||||
} catch (Exception e) {
|
||||
CTUtil.removeFile(filePath);
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
|
||||
getCurrentProxy().registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
||||
registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
||||
|
||||
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
||||
}
|
||||
|
|
@ -187,7 +173,7 @@ public class SignalFacade {
|
|||
monitoringRequest = staxXmlProcessor.read(in, MonitoringRequest.class,
|
||||
request -> {
|
||||
try {
|
||||
validationService.validateMonitoringRequest(request);
|
||||
ValidationUtil.validateMonitoringRequest(request);
|
||||
} catch (SignalClientException e) {
|
||||
if (request != null) {
|
||||
signalService.rejectPackage(request);
|
||||
|
|
@ -206,7 +192,7 @@ public class SignalFacade {
|
|||
return monitoringRequest;
|
||||
}
|
||||
|
||||
private String writeTmpFile(ZipInputStream zipInputStream) throws IOException {
|
||||
private String writeTmpFile(ZipInputStream zipInputStream) {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
|
||||
String filePath = folderPath + UUID.randomUUID() + "monitoring_request.xml";
|
||||
CTUtil.createFolder(folderPath);
|
||||
|
|
@ -220,16 +206,14 @@ public class SignalFacade {
|
|||
}
|
||||
|
||||
return filePath;
|
||||
} catch (Exception e) {
|
||||
log.error("Ошибка при записи файла запроса постановки на мониторинг на диск", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@SetAndClearMdc(argIndex = 1)
|
||||
public void registerFidsAndDebts(Long packageId, String packageName, String filePath) {
|
||||
Map<String, String> context = MDC.getCopyOfContextMap();
|
||||
private void registerFidsAndDebts(Integer packageId, String packageName, String filePath) {
|
||||
executor.execute(() -> {
|
||||
if (context != null) {
|
||||
MDC.setContextMap(context);
|
||||
}
|
||||
try {
|
||||
signalService.registerSubjects(filePath, packageId);
|
||||
CTUtil.removeFile(filePath);
|
||||
|
|
@ -240,10 +224,9 @@ public class SignalFacade {
|
|||
return;
|
||||
}
|
||||
if (signalRestService.setupMonitoring(packageId)) {
|
||||
LocalDateTime monitoringAt = LocalDateTime.now();
|
||||
log.info("Package was successfully registered in signal service. PackageId: {} PackageName: {}, MonitoringAt: {}", packageId, packageName, monitoringAt);
|
||||
signalService.updatePackageOnMonitoringSuccess(packageId, monitoringAt);
|
||||
monitoringErrorProcesingService.findErrors(packageId);
|
||||
log.info("Package was successfully registered in signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||
findErrors(packageId);
|
||||
} else {
|
||||
log.info("Package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||
|
|
@ -256,6 +239,27 @@ public class SignalFacade {
|
|||
});
|
||||
}
|
||||
|
||||
private void findErrors(Integer packageId) {
|
||||
UserPackage userPackage = signalService.findPackage(packageId);
|
||||
if (userPackage != null) {
|
||||
String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName();
|
||||
log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId);
|
||||
String fileName = signalRestService.getErrorFileName(packageId, packCode);
|
||||
if (StringUtils.isNotBlank(fileName)) {
|
||||
String filePath = signalRestService.loadErrorFile(packageId, fileName);
|
||||
if (StringUtils.isNotBlank(filePath)) {
|
||||
try {
|
||||
signalService.updateSubjectsErrors(filePath, packageId);
|
||||
CTUtil.removeFile(filePath);
|
||||
} catch (Exception e) {
|
||||
log.error("Ошибка при записи сообщений об ошибках в сформированных субъектах для мониторинга. Файл ошибок не будет удален. filePath = {}, Package_id = {}",
|
||||
fileName, packageId, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isZipFile(MultipartFile file) {
|
||||
return file.getContentType() != null &&
|
||||
(file.getContentType().equals("application/zip") || file.getContentType().equals("application/x-zip-compressed")) ||
|
||||
|
|
@ -290,43 +294,8 @@ public class SignalFacade {
|
|||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError, e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringAllPackagesResponse> findAllPackages(MonitoringAllPackagesRequest allPackagesRequest) {
|
||||
try {
|
||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(allPackagesRequest.getUserId(), allPackagesRequest.getPassword());
|
||||
if (!authResult.isSuccess()) {
|
||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringAllPackagesError);
|
||||
}
|
||||
List<UserPackage> activePackages = signalService.findAllPackages(allPackagesRequest.getUserId());
|
||||
|
||||
if (!activePackages.isEmpty()) {
|
||||
MonitoringAllPackagesResponse response = new MonitoringAllPackagesResponse();
|
||||
response.setStatus("OK");
|
||||
response.setMembercode(allPackagesRequest.getUserId().substring(0, 6));
|
||||
PackagesAll packages = new PackagesAll();
|
||||
activePackages.forEach(data -> {
|
||||
PackageAll pack = new PackageAll();
|
||||
pack.setPackageName(data.getPackageName());
|
||||
pack.setCreatedAt(data.getCreatedAt() != null ? data.getCreatedAt().toString() : null);
|
||||
pack.setStatus(data.getStatus());
|
||||
if (data.getStatus().equals(Status.DELETED.name())) {
|
||||
pack.setDeactivatedAt(data.getDeactivatedAt() != null ? data.getDeactivatedAt().toString() : null);
|
||||
}
|
||||
packages.getPackages().add(pack);
|
||||
});
|
||||
response.setPackages(packages);
|
||||
return ResponseEntity.ok(response);
|
||||
} else {
|
||||
throw clientExcp(SignalError.ERROR_019, XmlErrorFormat.MonitoringAllPackagesError);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringAllPackagesError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringActivePackagesError);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -351,25 +320,14 @@ public class SignalFacade {
|
|||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_017, XmlErrorFormat.MonitoringPackageDeleteError);
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<MonitoringReportListResponse> getReportList(String username, String packageName) {
|
||||
try {
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.PROCESSING)) {
|
||||
throw clientExcp(SignalError.ERROR_018, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.REJECTED)) {
|
||||
throw clientExcp(SignalError.ERROR_020, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.ERROR)) {
|
||||
throw clientExcp(SignalError.ERROR_021, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (signalService.isPackagesByStatusExist(username, packageName, Status.DELETED)) {
|
||||
throw clientExcp(SignalError.ERROR_022, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
if (!signalService.isPackagesByStatusExist(username, packageName, Status.ON_MONITORING)) {
|
||||
if (!signalService.hasActivePackages(username, packageName)) {
|
||||
throw clientExcp(SignalError.ERROR_012, XmlErrorFormat.MonitoringReportListError, packageName);
|
||||
}
|
||||
|
||||
|
|
@ -397,7 +355,8 @@ public class SignalFacade {
|
|||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringReportListError);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -405,7 +364,7 @@ public class SignalFacade {
|
|||
try {
|
||||
String memberCode = CTUtil.getMemberCodeFromFileName(fileName);
|
||||
if (memberCode == null) {
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError);
|
||||
}
|
||||
String dirPath = config.getLoadDir() + File.separator + memberCode;
|
||||
File folder = new File(dirPath);
|
||||
|
|
@ -416,21 +375,15 @@ public class SignalFacade {
|
|||
return ResponseEntity.ok().body(new FileUrlResource(file.getPath()));
|
||||
}
|
||||
} else {
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError);
|
||||
}
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError, fileName);
|
||||
throw clientExcp(SignalError.ERROR_014, XmlErrorFormat.MonitoringDownloadError);
|
||||
} catch (Exception e) {
|
||||
if (e instanceof SignalClientException) {
|
||||
throw (SignalClientException) e;
|
||||
}
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e);
|
||||
log.error(e.getMessage(), e);
|
||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError);
|
||||
}
|
||||
}
|
||||
|
||||
private SignalFacade getCurrentProxy() {
|
||||
if (self == null) {
|
||||
self = (SignalFacade) AopContext.currentProxy();
|
||||
}
|
||||
return self;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,16 +10,15 @@ import java.util.List;
|
|||
@Mapper
|
||||
public interface PhoneFidMapMapper {
|
||||
|
||||
void registerSubjects(@Param("subjects") List<Subject> subjects, @Param("packageId") Long packageId);
|
||||
void registerSubjects(@Param("subjects") List<Subject> subjects, @Param("packageId") Integer packageId);
|
||||
|
||||
List<PhoneFidMap> findFullPhoneFidMap(@Param("packageId") Long packageId, @Param("offset") int offset, @Param("limit") int limit);
|
||||
List<PhoneFidMap> findFullPhoneFidMap(@Param("packageId") Integer packageId, @Param("offset") int offset, @Param("limit") int limit);
|
||||
|
||||
void updatePhoneFidMaps(@Param("subjects") List<PhoneFidMap> subjects);
|
||||
|
||||
void updatePhoneFidMapsErrors(@Param("subjects") List<PhoneFidMap> subjects);
|
||||
|
||||
PhoneFidMap findPhoneFidMapById(@Param("id") Long packageId);
|
||||
PhoneFidMap findPhoneFidMapById(@Param("id") Integer packageId);
|
||||
|
||||
boolean hasNonNullFids(@Param("packageId") Long packageId);
|
||||
boolean hasOldRow(@Param("packageId") Long packageId, @Param("daysCount") Integer daysCount);
|
||||
boolean hasNonNullFids(@Param("packageId") Integer packageId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,19 +18,15 @@ public interface UserPackageMapper {
|
|||
|
||||
void deletePackage(@Param("userId") String userId, @Param("packageName") String packageName, @Param("status") String newStatus, @Param("previousStatus") String previousStatus, @Param("deactivatedAt") LocalDateTime deactivatedAt);
|
||||
|
||||
Long insertPackage(@Param("userPackage") UserPackage userPackage);
|
||||
Integer insertPackage(@Param("userPackage") UserPackage userPackage);
|
||||
|
||||
void updatePackageStatus(@Param("packageId") Long packageId, @Param("status") String status);
|
||||
void updatePackageStatus(@Param("packageId") Integer packageId, @Param("status") String status);
|
||||
|
||||
void updatePackageLastDownloadedReport(@Param("id") Long id, @Param("fileName") String fileName);
|
||||
void updatePackageLastDownloadedReport(@Param("id") Integer id, @Param("fileName") String fileName);
|
||||
|
||||
void updatePackageOnMonitoringSuccess(@Param("id") Long id, @Param("monitoringAt") LocalDateTime monitoringAt);
|
||||
|
||||
UserPackage findPackage(@Param("id") Long id);
|
||||
UserPackage findPackage(@Param("id") Integer id);
|
||||
|
||||
List<UserPackage> findUserPackages(@Param("userId") String userId, @Param("statuses") List<String> status);
|
||||
|
||||
List<UserPackage> findAllPackagesByStatus(@Param("status") String status);
|
||||
|
||||
List<UserPackage> findAllPackagesByUserId(@Param("userId") String userId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,59 +0,0 @@
|
|||
package ru.nbch.credit_tracker.service;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||
public class MonitoringErrorProcesingService {
|
||||
|
||||
private MonitoringErrorProcesingService self;
|
||||
|
||||
private final SignalService signalService;
|
||||
private final SignalRestService signalRestService;
|
||||
|
||||
public MonitoringErrorProcesingService(SignalService signalService, SignalRestService signalRestService) {
|
||||
this.signalService = signalService;
|
||||
this.signalRestService = signalRestService;
|
||||
}
|
||||
|
||||
public void findErrors(Long packageId) {
|
||||
UserPackage userPackage = signalService.findPackage(packageId);
|
||||
getCurrentProxy().processPackage(userPackage, packageId);
|
||||
}
|
||||
|
||||
@SetAndClearMdc
|
||||
public void processPackage(UserPackage userPackage, Long packageId) {
|
||||
if (userPackage != null) {
|
||||
String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName();
|
||||
log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId);
|
||||
String fileName = signalRestService.getErrorFileName(packageId, packCode);
|
||||
if (StringUtils.isNotBlank(fileName)) {
|
||||
String filePath = signalRestService.loadErrorFile(packageId, fileName);
|
||||
if (StringUtils.isNotBlank(filePath)) {
|
||||
try {
|
||||
signalService.updateSubjectsErrors(filePath, packageId);
|
||||
} catch (Exception e) {
|
||||
log.error("Ошибка при записи сообщений об ошибках в сформированных субъектах для мониторинга. Package_id = {}", packageId, e);
|
||||
}
|
||||
CTUtil.removeFile(filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private MonitoringErrorProcesingService getCurrentProxy() {
|
||||
if (self == null) {
|
||||
self = (MonitoringErrorProcesingService) AopContext.currentProxy();
|
||||
}
|
||||
return self;
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,6 @@ package ru.nbch.credit_tracker.service;
|
|||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
|
|
@ -34,7 +33,6 @@ import java.util.UUID;
|
|||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
|
|
@ -70,99 +68,87 @@ public class MonitoringService {
|
|||
log.info("Start monitoring");
|
||||
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
||||
for (UserPackage userPackage : packages) {
|
||||
MDC.put("ru.nbch.credit_tracker.log.mdc.key", "[" + userPackage.getPackageName() +"]");
|
||||
processPackage(userPackage);
|
||||
MDC.remove("ru.nbch.credit_tracker.log.mdc.key");
|
||||
}
|
||||
log.info("Finish monitoring");
|
||||
}
|
||||
log.info("Processing package {}", userPackage.getPackageName());
|
||||
if (!signalService.hasNonNullfids(userPackage.getId())) {
|
||||
log.info("Package {} has no fids. Package will be skipped.", userPackage.getPackageName());
|
||||
continue;
|
||||
}
|
||||
SgnlOnlineReport onlineReports = signalRestService.getReports(userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName());
|
||||
|
||||
private void processPackage(UserPackage userPackage) {
|
||||
log.info("Processing package");
|
||||
if (!signalService.hasNonNullfids(userPackage.getId())) {
|
||||
log.info("Package has no fids. Package will be skipped.");
|
||||
return;
|
||||
}
|
||||
SgnlOnlineReport onlineReports = signalRestService.getReports(userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName());
|
||||
if (onlineReports == null) {
|
||||
log.info("No reports found for package {}", userPackage.getPackageName());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (onlineReports == null) {
|
||||
log.info("No reports found for package");
|
||||
return;
|
||||
}
|
||||
// Формируем список имен файлов, по которым сработали сигналы. Сюда входят только те имена, у которых парсится дата формирования отчета
|
||||
List<String> fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename)
|
||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList();
|
||||
|
||||
// Формируем список имен файлов, по которым сработали сигналы. Сюда входят только те имена, у которых парсится дата формирования отчета
|
||||
List<String> fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename)
|
||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList();
|
||||
if (fileNames.isEmpty()) {
|
||||
log.info("No new report found for package {}", userPackage.getPackageName());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fileNames.isEmpty()) {
|
||||
log.info("No new report found for package");
|
||||
return;
|
||||
}
|
||||
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport());
|
||||
|
||||
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport());
|
||||
if (lastDownloadedReportDate != null) {
|
||||
// Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета
|
||||
fileNames = fileNames.stream()
|
||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
|
||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||
.toList();
|
||||
} else {
|
||||
fileNames = fileNames.stream()
|
||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||
.toList();
|
||||
}
|
||||
|
||||
if (lastDownloadedReportDate != null) {
|
||||
// Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета
|
||||
fileNames = fileNames.stream()
|
||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
|
||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||
.toList();
|
||||
} else {
|
||||
fileNames = fileNames.stream()
|
||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||
.toList();
|
||||
}
|
||||
if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
|
||||
log.info("Last downloaded report found for package {}. Last Downloaded Report Name: {}", userPackage.getPackageName(), userPackage.getLastDownloadedReport());
|
||||
} else {
|
||||
log.info("Last Downloaded Report Name is empty");
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
|
||||
log.info("Last downloaded report found for package. Last Downloaded Report Name: {}", userPackage.getLastDownloadedReport());
|
||||
} else {
|
||||
log.info("Last Downloaded Report Name is empty");
|
||||
}
|
||||
|
||||
for (String newReport : fileNames) {
|
||||
try {
|
||||
String loadedReportPath = null;
|
||||
if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
|
||||
loadedReportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
|
||||
} else if (lastDownloadedReportDate != null) {
|
||||
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
|
||||
if (newReportDate.isAfter(lastDownloadedReportDate)) {
|
||||
loadedReportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу
|
||||
for (String newReport : fileNames) {
|
||||
try {
|
||||
String reportPath = null;
|
||||
if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
|
||||
reportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
|
||||
} else if (lastDownloadedReportDate != null) {
|
||||
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
|
||||
if (newReportDate.isAfter(lastDownloadedReportDate)) {
|
||||
reportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу
|
||||
}
|
||||
}
|
||||
if (reportPath == null) {
|
||||
log.info("Report was not loaded for package {}", userPackage.getPackageName());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (loadedReportPath == null) {
|
||||
log.info("Report was not loaded for package");
|
||||
continue;
|
||||
}
|
||||
|
||||
String responsePath = generateResponse(userPackage, loadedReportPath);
|
||||
String fileName = null;
|
||||
if (responsePath != null) {
|
||||
fileName = createResponseFile(userPackage, responsePath);
|
||||
String responsePath = generateResponse(userPackage, reportPath);
|
||||
String fileName = createResponseFile(userPackage, responsePath);
|
||||
if (fileName != null) {
|
||||
log.info("New report fileName: {}", fileName);
|
||||
updateSignalHits(userPackage, responsePath, fileName);
|
||||
signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
|
||||
} else {
|
||||
log.info("Report was not created for package {}", userPackage.getPackageName());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
if (fileName != null) {
|
||||
log.info("New report fileName: {}", fileName);
|
||||
updateSignalHits(userPackage, responsePath, fileName);
|
||||
signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
|
||||
} else {
|
||||
log.info("Report was not created for package");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
log.info("Finish monitoring");
|
||||
}
|
||||
|
||||
/**
|
||||
* Формирует результирующий xml файл для конечного пользователя на основе файла из официального сервиса сигналов
|
||||
* @return Путь к временному рещультирующему файлу
|
||||
*/
|
||||
private String generateResponse(UserPackage userPackage, String loadedReportPath) {
|
||||
AtomicBoolean generateResponse = new AtomicBoolean(false); // Выставляется в true, если хотя бы один субъект с мониторинга подошел под условие срабатывания сигнала. В этом случае отчет сохраняется
|
||||
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
|
||||
private String generateResponse(UserPackage userPackage, String reportPath) {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator + userPackage.getId() + File.separator;
|
||||
String responsePath = folderPath + UUID.randomUUID() + "_response_output.xml";
|
||||
CTUtil.createFolder(folderPath);
|
||||
|
||||
MonitoringSignalResponse response = new MonitoringSignalResponse();
|
||||
response.setPackageName(userPackage.getPackageName()); // Имя пакета, переданного при установке
|
||||
|
|
@ -171,13 +157,10 @@ public class MonitoringService {
|
|||
MonitoringSignalResponseStaxXmlWriter staxXmlWriter = new MonitoringSignalResponseStaxXmlWriter(config.getEncoding());
|
||||
staxXmlWriter.writeWithStax(responsePath, response,
|
||||
writer -> {
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(loadedReportPath)), 8 * 1024 * 1024)) {
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(reportPath)), 8 * 1024 * 1024)) {
|
||||
staxXmlProcessor.read(in, Persons.class,
|
||||
personsData -> { // как только считали пачку Persons сразу записали ее в результирующий файл
|
||||
List<Subject> subjectsBatch = processPersons(personsData.getPersons());
|
||||
if (!subjectsBatch.isEmpty()) {
|
||||
generateResponse.set(true);
|
||||
}
|
||||
writer.accept(subjectsBatch);
|
||||
personsData.getPersons().clear(); // чистим список для экономии памяти
|
||||
},
|
||||
|
|
@ -190,12 +173,10 @@ public class MonitoringService {
|
|||
}
|
||||
});
|
||||
|
||||
|
||||
CTUtil.removeFile(loadedReportPath);
|
||||
|
||||
if (!generateResponse.get()) { // ни один субъект не подошел под условие, удаляем временный отчет
|
||||
CTUtil.removeFile(responsePath);
|
||||
return null;
|
||||
try {
|
||||
Files.delete(Path.of(reportPath));
|
||||
} catch (IOException e) {
|
||||
log.warn("File {} hasn't been deleted", reportPath);
|
||||
}
|
||||
|
||||
return responsePath;
|
||||
|
|
@ -242,15 +223,15 @@ public class MonitoringService {
|
|||
try {
|
||||
String fileName = CTUtil.generateResponseReportFileName(userPackage.getUserId(), userPackage.getPackageName());
|
||||
Thread.sleep(1000); // Если отчеты формируются слишком быстро, нужно подождать секунду, тк в имени отчета LocalDateTime до секунд
|
||||
String folderPath = config.getLoadDir() + File.separator + userPackage.getUserId().substring(0, 6) + File.separator;
|
||||
String filePath = config.getLoadDir() + File.separator + userPackage.getUserId().substring(0, 6) + File.separator;
|
||||
|
||||
File folder = new File(folderPath);
|
||||
File folder = new File(filePath);
|
||||
if (!folder.exists()) {
|
||||
folder.mkdir();
|
||||
}
|
||||
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(responsePath)), 8 * 1024 * 1024);
|
||||
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(folderPath + fileName + ".zip"));
|
||||
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath + fileName + ".zip"));
|
||||
ZipOutputStream zos = new ZipOutputStream(bos)) {
|
||||
|
||||
ZipEntry zipEntry = new ZipEntry(fileName + ".xml");
|
||||
|
|
@ -270,7 +251,11 @@ public class MonitoringService {
|
|||
log.error("Ошибка при записи отчета пользователя в файл: ", e);
|
||||
}
|
||||
|
||||
CTUtil.removeFile(responsePath);
|
||||
try {
|
||||
Files.delete(Path.of(responsePath));
|
||||
} catch (IOException e) {
|
||||
log.warn("File {} hasn't been deleted", responsePath);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
@ -304,15 +289,19 @@ public class MonitoringService {
|
|||
10000,
|
||||
"/MonitoringSignalResponse/Subjects/Subject");
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Error while updating hits", e);
|
||||
throw new RuntimeException("Error while and updating hits", e);
|
||||
}
|
||||
|
||||
CTUtil.removeFile(responsePath); // удалям результирующий xml файл с диска (Он уже заархивирован к этому моменту)
|
||||
try {
|
||||
Files.delete(Path.of(responsePath)); // удалям результирующий xml файл с диска (Он уже заархивирован к этому моменту)
|
||||
} catch (IOException e) {
|
||||
log.warn("File {} hasn't been deleted", responsePath);
|
||||
}
|
||||
|
||||
log.info("Signal hits updated for package {}", userPackage.getPackageName());
|
||||
}
|
||||
|
||||
public String loadReport(Long packageId, String reportName) {
|
||||
public String loadReport(Integer packageId, String reportName) {
|
||||
return signalRestService.downloadReport(packageId, reportName);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ public class SignalService {
|
|||
return userPackageService.isPackageNotUnique(request.getUserId(), request.getPackageName());
|
||||
}
|
||||
|
||||
public Long registerPackage(MonitoringRequest request) {
|
||||
public Integer registerPackage(MonitoringRequest request) {
|
||||
UserPackage userPackage = UserPackage.builder()
|
||||
.userId(request.getUserId())
|
||||
.packageName(request.getPackageName())
|
||||
|
|
@ -82,7 +82,7 @@ public class SignalService {
|
|||
return userPackageService.insertPackage(userPackage);
|
||||
}
|
||||
|
||||
public void registerSubjects(String filePath, Long packageId) {
|
||||
public void registerSubjects(String filePath, Integer packageId) {
|
||||
log.info("Start registering subjects. PackageId: {}", packageId);
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(filePath)), 8 * 1024 * 1024)) {
|
||||
staxXmlProcessor.read(in, MonitoringRequest.class,
|
||||
|
|
@ -105,7 +105,7 @@ public class SignalService {
|
|||
/**
|
||||
* Обрабатывает все PhoneFidMap по packageId, выгружая их пачками и фильтруя по переданному фильтру
|
||||
*/
|
||||
public UpdateResult updateSubjects(Long packageId, Predicate<PhoneFidMap> filter) {
|
||||
public UpdateResult updateSubjects(Integer packageId, Predicate<PhoneFidMap> filter) {
|
||||
boolean updated = false;
|
||||
boolean noFidsFound = true;
|
||||
int offset = 0;
|
||||
|
|
@ -141,7 +141,7 @@ public class SignalService {
|
|||
* Обрабатывает пачку PhoneFidMap: обновляет фиды и флаги просрочек
|
||||
* @return fidsFound true - если хотя бы по одному номеру был найден фид, false - в противном случае
|
||||
*/
|
||||
public boolean updateFlags(List<PhoneFidMap> subjects, Long packageId) {
|
||||
public boolean updateFlags(List<PhoneFidMap> subjects, Integer packageId) {
|
||||
log.info("Start calculating fids and flags for subjects batch. PackageId: {}", packageId);
|
||||
Map<String, Integer> fidsMap = phoneService.findFidsPhoneData(subjects);
|
||||
LocalDateTime calculatedAt = LocalDateTime.now();
|
||||
|
|
@ -197,22 +197,19 @@ public class SignalService {
|
|||
userPackageService.insertPackage(userPackage);
|
||||
}
|
||||
|
||||
public void updatePackageStatus(Long packageId, Status status) {
|
||||
public void updatePackageStatus(Integer packageId, Status status) {
|
||||
userPackageService.updatePackageStatus(packageId, status);
|
||||
}
|
||||
|
||||
public void updatePackageOnMonitoringSuccess(Long packageId, LocalDateTime monitoringAt) {
|
||||
userPackageService.updatePackageOnMonitoringSuccess(packageId, monitoringAt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Формирует файл запроса в официальный сервис сигналов, выгружая паспортные данные пачками и сразу записывая их в файл
|
||||
*
|
||||
* @return Путь к файлу запроса к официальному сервису сигналов на постановку на мониторинг
|
||||
*/
|
||||
public String writeSignals(Long packageId) {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
|
||||
public String writeSignals(Integer packageId) {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator + packageId + File.separator;
|
||||
String filePath = folderPath + UUID.randomUUID() + "_output.xml";
|
||||
|
||||
CTUtil.createFolder(folderPath);
|
||||
|
||||
Signals signals = buildSignals(packageId);
|
||||
|
|
@ -226,7 +223,7 @@ public class SignalService {
|
|||
return filePath;
|
||||
}
|
||||
|
||||
private Signals buildSignals(Long packageId) {
|
||||
private Signals buildSignals(Integer packageId) {
|
||||
UserPackage userPackage = userPackageService.findPackage(packageId);
|
||||
Signals signals = new Signals();
|
||||
signals.setOnline("2"); // Всегда=2 (только онлайн-сигналы)
|
||||
|
|
@ -242,7 +239,7 @@ public class SignalService {
|
|||
* Обрабатывает все PhoneFidMap по packageId, выгружая их пачками и фильтруя по переданному фильтру.
|
||||
* writer записывает пачку сразу в файл
|
||||
*/
|
||||
private void buildPersons(Long packageId, Consumer<List<Person>> writer) {
|
||||
private void buildPersons(Integer packageId, Consumer<List<Person>> writer) {
|
||||
int offset = 0;
|
||||
List<PhoneFidMap> batch;
|
||||
do {
|
||||
|
|
@ -282,14 +279,14 @@ public class SignalService {
|
|||
return persons;
|
||||
}
|
||||
|
||||
public void updateSubjectsErrors(String filePath, Long packageId) {
|
||||
public void updateSubjectsErrors(String filePath, Integer packageId) {
|
||||
log.info("Start updating subjects errors. PackageId: {}", packageId);
|
||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(filePath)), 8 * 1024 * 1024)) {
|
||||
staxXmlProcessor.read(in, MonitoringReportErrors.class,
|
||||
request -> {
|
||||
if (!request.getPersons().isEmpty()) {
|
||||
List<PhoneFidMap> subjects = request.getPersons().stream().map(p -> {
|
||||
log.warn("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue());
|
||||
log.error("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue());
|
||||
return PhoneFidMap.builder()
|
||||
.id(p.getUid())
|
||||
.errorText(p.getValue())
|
||||
|
|
@ -310,19 +307,15 @@ public class SignalService {
|
|||
}
|
||||
|
||||
public List<UserPackage> findActivePackages(String userId) {
|
||||
return userPackageService.findUserPackages(userId, Status.ON_MONITORING);
|
||||
}
|
||||
|
||||
public List<UserPackage> findAllPackages(String userId) {
|
||||
return userPackageService.findAllPackagesByUserId(userId);
|
||||
return userPackageService.findUserPackages(userId, Status.ON_MONITORING, Status.PROCESSING);
|
||||
}
|
||||
|
||||
public boolean isPackageExists(String username, String packageName) {
|
||||
return userPackageService.isPackageExists(username, packageName, Status.ON_MONITORING);
|
||||
}
|
||||
|
||||
public boolean isPackagesByStatusExist(String username, String packageName, Status status) {
|
||||
return userPackageService.hasActivePackages(username, packageName, status);
|
||||
public boolean hasActivePackages(String username, String packageName) {
|
||||
return userPackageService.hasActivePackages(username, packageName, Status.ON_MONITORING, Status.PROCESSING);
|
||||
}
|
||||
|
||||
public void deletePackage(String username, String packageName, LocalDateTime deactivatedAt) {
|
||||
|
|
@ -341,19 +334,19 @@ public class SignalService {
|
|||
hitsService.insertHits(hits);
|
||||
}
|
||||
|
||||
public void updateLastDownloadedReport(Long id, String fileName) {
|
||||
public void updateLastDownloadedReport(Integer id, String fileName) {
|
||||
userPackageService.updatePackageLastDownloadedReport(id, fileName);
|
||||
}
|
||||
|
||||
public PhoneFidMap findPhoneFidMapById(Long id) {
|
||||
public PhoneFidMap findPhoneFidMapById(Integer id) {
|
||||
return phoneFidMapService.findPhoneFidMapById(id);
|
||||
}
|
||||
|
||||
public boolean hasNonNullfids(Long packageId) {
|
||||
public boolean hasNonNullfids(Integer packageId) {
|
||||
return phoneFidMapService.hasNonNullfids(packageId);
|
||||
}
|
||||
|
||||
public UserPackage findPackage(Long packageId) {
|
||||
public UserPackage findPackage(Integer packageId) {
|
||||
return userPackageService.findPackage(packageId);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
package ru.nbch.credit_tracker.service;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
|
|
@ -17,21 +14,14 @@ import java.util.List;
|
|||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||
public class UpdateProcessingPackagesService {
|
||||
|
||||
private UpdateProcessingPackagesService self;
|
||||
|
||||
private final SignalService signalService;
|
||||
private final SignalRestService signalRestService;
|
||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||
|
||||
public UpdateProcessingPackagesService(SignalService signalService,
|
||||
SignalRestService signalRestService,
|
||||
MonitoringErrorProcesingService monitoringErrorProcesingService) {
|
||||
public UpdateProcessingPackagesService(SignalService signalService, SignalRestService signalRestService) {
|
||||
this.signalService = signalService;
|
||||
this.signalRestService = signalRestService;
|
||||
this.monitoringErrorProcesingService = monitoringErrorProcesingService;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
|
|
@ -39,26 +29,24 @@ public class UpdateProcessingPackagesService {
|
|||
List<UserPackage> packages = signalService.findPackagesOnProcessing();
|
||||
for (UserPackage userPackage : packages) {
|
||||
log.info("Updating flags for Package {}", userPackage.getPackageName());
|
||||
getCurrentProxy().process(userPackage.getId(), userPackage.getPackageName());
|
||||
process(userPackage.getId(), userPackage.getPackageName());
|
||||
}
|
||||
log.info("Finish updating processing packages");
|
||||
}
|
||||
|
||||
@SetAndClearMdc(argIndex = 1)
|
||||
public void process(Long packageId, String packageName) {
|
||||
private void process(Integer packageId, String packageName) {
|
||||
try {
|
||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
||||
if (updateResult.isNoFidsFound()) {
|
||||
log.info("No fids found for PackageId: {} . Package status ON_MONITORING. No registration in signal service.", packageId);
|
||||
log.info("No fids found for PackageId: {} PackageName: {}. Package status ON_MONITORING. No registration in signal service.", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||
return;
|
||||
}
|
||||
if (signalRestService.setupMonitoring(packageId)) {
|
||||
log.info("Package was successfully registered in signal service. PackageId: {}", packageId);
|
||||
log.info("Package was successfully registered in signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||
monitoringErrorProcesingService.findErrors(packageId);
|
||||
} else {
|
||||
log.info("Package registration was rejected by signal service. PackageId: {}", packageId);
|
||||
log.info("Package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
|
@ -66,11 +54,4 @@ public class UpdateProcessingPackagesService {
|
|||
log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}", packageId, e);
|
||||
}
|
||||
}
|
||||
|
||||
private UpdateProcessingPackagesService getCurrentProxy() {
|
||||
if (self == null) {
|
||||
self = (UpdateProcessingPackagesService) AopContext.currentProxy();
|
||||
}
|
||||
return self;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,18 +1,21 @@
|
|||
package ru.nbch.credit_tracker.service;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.springframework.scheduling.support.CronTrigger;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||
import ru.nbch.credit_tracker.enums.Status;
|
||||
import ru.nbch.credit_tracker.mapper.signal.PhoneFidMapMapper;
|
||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* Сервис периодического обновления фидов и флагов просрочек по пакетам находящимся в статусе ON_MONITORING
|
||||
|
|
@ -24,59 +27,42 @@ public class UpdatingFlagsService {
|
|||
|
||||
private final SignalService signalService;
|
||||
private final SignalRestService signalRestService;
|
||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||
private final Long daysToUpdateFlags;
|
||||
private final String updateFlagsCronExpression;
|
||||
private final PhoneFidMapMapper phoneFidMapMapper;
|
||||
private final Long updateFlagsInterval;
|
||||
|
||||
public UpdatingFlagsService(SignalService signalService,
|
||||
SignalRestService signalRestService,
|
||||
MonitoringErrorProcesingService monitoringErrorProcesingService,
|
||||
CreditTrackerSettings config,
|
||||
PhoneFidMapMapper phoneFidMapMapper) {
|
||||
CreditTrackerSettings config) {
|
||||
this.signalService = signalService;
|
||||
this.signalRestService = signalRestService;
|
||||
this.monitoringErrorProcesingService = monitoringErrorProcesingService;
|
||||
this.daysToUpdateFlags = config.getDaysToUpdateFlags() != null ? config.getDaysToUpdateFlags() : 1;
|
||||
this.updateFlagsCronExpression = config.getUpdateFlagsCronExpression() != null ? config.getUpdateFlagsCronExpression() : "*/10 * * * * *";
|
||||
this.phoneFidMapMapper = phoneFidMapMapper;
|
||||
this.updateFlagsInterval = config.getUpdateFlagsInterval() != null ? config.getUpdateFlagsInterval() : 1;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
|
||||
scheduler.setPoolSize(1);
|
||||
scheduler.initialize();
|
||||
scheduler.schedule(this::update, new CronTrigger(updateFlagsCronExpression));
|
||||
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new CustomizableThreadFactory("updating-flags-"));
|
||||
scheduler.scheduleAtFixedRate(this::update, 0, updateFlagsInterval, TimeUnit.DAYS);
|
||||
}
|
||||
|
||||
public void update() {
|
||||
private void update() {
|
||||
log.info("Start updating flags");
|
||||
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
||||
for (UserPackage userPackage : packages) {
|
||||
MDC.put("ru.nbch.credit_tracker.log.mdc.key", "[" + userPackage.getPackageName() +"]");
|
||||
log.info("Check on updating flags for Package {}", userPackage.getPackageName());
|
||||
boolean hasOldRow = phoneFidMapMapper.hasOldRow(userPackage.getId(), daysToUpdateFlags.intValue());
|
||||
log.info("There are {} old rows", hasOldRow ? "exist" : "doesn't exist");
|
||||
if (hasOldRow) {
|
||||
updateFlags(userPackage);
|
||||
}
|
||||
MDC.remove("ru.nbch.credit_tracker.log.mdc.key");
|
||||
log.info("Updating flags for Package {}", userPackage.getPackageName());
|
||||
updateFlags(userPackage.getId(), userPackage.getPackageName());
|
||||
}
|
||||
log.info("Finish updating flags");
|
||||
}
|
||||
|
||||
private void updateFlags(UserPackage userPackage) {
|
||||
Long packageId = userPackage.getId();
|
||||
String packageName = userPackage.getPackageName();
|
||||
private void updateFlags(Integer packageId, String packageName) {
|
||||
try {
|
||||
signalService.updatePackageStatus(packageId, Status.PROCESSING);
|
||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
||||
Predicate<PhoneFidMap> filter = subject -> subject.getCalculatedAt() != null && hasDaysPassed(subject.getCalculatedAt());
|
||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, filter);
|
||||
if (updateResult.isUpdated()) {
|
||||
if (signalRestService.setupMonitoring(packageId)) {
|
||||
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);
|
||||
signalService.updatePackageOnMonitoringSuccess(packageId, monitoringAt);
|
||||
monitoringErrorProcesingService.findErrors(packageId);
|
||||
log.info("Flags were updated successfully. PackageId: {} PackageName: {}. Package status changed to ON_MONITORING", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||
} else {
|
||||
log.info("Updated package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||
|
|
|
|||
|
|
@ -16,11 +16,11 @@ public class PhoneFidMapService {
|
|||
this.mapper = mapper;
|
||||
}
|
||||
|
||||
public void registerSubjects(List<Subject> subjects, Long packageId) {
|
||||
public void registerSubjects(List<Subject> subjects, Integer packageId) {
|
||||
mapper.registerSubjects(subjects, packageId);
|
||||
}
|
||||
|
||||
public List<PhoneFidMap> findFullPhoneFidMap(Long packageId, int offset, int limit) {
|
||||
public List<PhoneFidMap> findFullPhoneFidMap(Integer packageId, int offset, int limit) {
|
||||
return mapper.findFullPhoneFidMap(packageId, offset, limit);
|
||||
}
|
||||
|
||||
|
|
@ -32,11 +32,11 @@ public class PhoneFidMapService {
|
|||
mapper.updatePhoneFidMapsErrors(subjects);
|
||||
}
|
||||
|
||||
public PhoneFidMap findPhoneFidMapById(Long id) {
|
||||
public PhoneFidMap findPhoneFidMapById(Integer id) {
|
||||
return mapper.findPhoneFidMapById(id);
|
||||
}
|
||||
|
||||
public boolean hasNonNullfids(Long packageId) {
|
||||
public boolean hasNonNullfids(Integer packageId) {
|
||||
return mapper.hasNonNullFids(packageId);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,16 +19,12 @@ import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
|
|||
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.security.MessageDigest;
|
||||
import java.util.Base64;
|
||||
import java.util.UUID;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
|
|
@ -68,7 +64,7 @@ public class SignalRestService {
|
|||
* Ставит пакет на мониторинг в официальный сервис сигналов
|
||||
* @return true - если пакет успешно поставился на мониторинг. false - в противном случае
|
||||
*/
|
||||
public boolean setupMonitoring(Long packageId) throws Exception {
|
||||
public boolean setupMonitoring(Integer packageId) throws Exception {
|
||||
String path = signalService.writeSignals(packageId);
|
||||
Resource request = compressFile(path);
|
||||
|
||||
|
|
@ -85,8 +81,12 @@ public class SignalRestService {
|
|||
|
||||
if (response.getStatusCode().value() == 302) {
|
||||
// good response
|
||||
CTUtil.removeFile(path);
|
||||
CTUtil.removeFile(path + ".gz");
|
||||
try {
|
||||
Files.delete(Path.of(path));
|
||||
Files.delete(Path.of(path + ".gz"));
|
||||
} catch (IOException e) {
|
||||
log.warn("File {} hasn't been deleted", path);
|
||||
}
|
||||
return true;
|
||||
} else if (response.getStatusCode().value() == 200 && response.getBody() != null) {
|
||||
SgnlReport error = staxProcessor.read(response.getBody(), SgnlReport.class);
|
||||
|
|
@ -95,8 +95,7 @@ public class SignalRestService {
|
|||
} else {
|
||||
log.error("неизвестная ошибка при постановке пакета на мониторинг в официальный сервис сигналов: {}", response.getBody());
|
||||
}
|
||||
CTUtil.removeFile(path);
|
||||
CTUtil.removeFile(path + ".gz");
|
||||
log.info("Files will not be deleted: {}, {}", path, path + ".gz");
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
|
@ -105,7 +104,7 @@ public class SignalRestService {
|
|||
/**
|
||||
* @return имя файла с ошибками по поставленному на мониторинг отчету
|
||||
*/
|
||||
public String getErrorFileName(Long packageId, String packCode) {
|
||||
public String getErrorFileName(Integer packageId, String packCode) {
|
||||
String url = GET_REPORT_URI + "?packCode=" + packCode;
|
||||
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
|
|
@ -131,7 +130,7 @@ public class SignalRestService {
|
|||
SgnlReportMonitorigSetupError report = xmlProcessor.read(answer, SgnlReportMonitorigSetupError.class);
|
||||
if (report.getOperationReport().getErrorsForNextReport() != null) {
|
||||
String fileName = report.getOperationReport().getErrorsForNextReport().getFilename();
|
||||
log.warn("Найдены ошибки по пакету. packCode={}, packageId={}, fileName = {}", packCode, packageId, fileName);
|
||||
log.error("Найдены ошибки по пакету. packCode={}, packageId={}, fileName = {}", packCode, packageId, fileName);
|
||||
return fileName;
|
||||
} else {
|
||||
log.info("Пакет был поставлен на мониторинг без ошибок. packCode={}, packageId={}", packCode, packageId);
|
||||
|
|
@ -148,7 +147,7 @@ public class SignalRestService {
|
|||
*
|
||||
* @return путь к разархивированному файлу. Пример: <loadDir>/tmp_folder/<package_id>/0001XX_MY_BATCH_223112.1.errors.xml.gz
|
||||
*/
|
||||
public String loadErrorFile(Long packageId, String fileName) {
|
||||
public String loadErrorFile(Integer packageId, String fileName) {
|
||||
String url = DOWNLOAD_REPORT_URI + "?fNameRequest=" + fileName;
|
||||
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
|
|
@ -229,7 +228,7 @@ public class SignalRestService {
|
|||
*
|
||||
* @return путь к разархивированному файлу. Пример: <loadDir>/tmp_folder/<package_id>/0001XX_MY_BATCH_204.1.online.2025-07-08T20-00-46.xml.gz.xml
|
||||
*/
|
||||
public String downloadReport(Long packageId, String reportName) {
|
||||
public String downloadReport(Integer packageId, String reportName) {
|
||||
String url = DOWNLOAD_ONLINE_REPORT_URI + "?fNameReport=" + reportName;
|
||||
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
|
|
@ -247,7 +246,7 @@ public class SignalRestService {
|
|||
return unzipReport(response,packageId, reportName);
|
||||
}
|
||||
|
||||
private String unzipReport(ResponseEntity<byte[]> response, Long packageId, String reportName) {
|
||||
private String unzipReport(ResponseEntity<byte[]> response, Integer packageId, String reportName) {
|
||||
boolean isGzipped = response.getHeaders().getContentType() != null
|
||||
&& response.getHeaders().getContentType().toString().equals("application/x-gzip");
|
||||
|
||||
|
|
@ -260,8 +259,8 @@ public class SignalRestService {
|
|||
log.error("Неизвестная ошибка при скачивание отчета. fNameReport={}", reportName);
|
||||
return null;
|
||||
} else {
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator;
|
||||
String filePath = folderPath + UUID.randomUUID() + reportName + ".xml";
|
||||
String folderPath = config.getLoadDir() + File.separator + "tmp_folder" + File.separator + packageId + File.separator;
|
||||
String filePath = folderPath + reportName + ".xml";
|
||||
CTUtil.createFolder(folderPath);
|
||||
|
||||
try (InputStream in = new GZIPInputStream(new ByteArrayInputStream(response.getBody()));
|
||||
|
|
|
|||
|
|
@ -34,23 +34,19 @@ public class UserPackageService {
|
|||
mapper.deletePackage(userId.substring(0, 6), packageName, newStatus.name(), previousStatus.name(), deactivatedAt);
|
||||
}
|
||||
|
||||
public Long insertPackage(UserPackage userPackage) {
|
||||
public Integer insertPackage(UserPackage userPackage) {
|
||||
return mapper.insertPackage(userPackage);
|
||||
}
|
||||
|
||||
public void updatePackageStatus(Long packageId, Status status) {
|
||||
public void updatePackageStatus(Integer packageId, Status status) {
|
||||
mapper.updatePackageStatus(packageId, status.name());
|
||||
}
|
||||
|
||||
public void updatePackageLastDownloadedReport(Long id, String fileName) {
|
||||
public void updatePackageLastDownloadedReport(Integer id, String fileName) {
|
||||
mapper.updatePackageLastDownloadedReport(id, fileName);
|
||||
}
|
||||
|
||||
public void updatePackageOnMonitoringSuccess(Long id, LocalDateTime monitoringAt) {
|
||||
mapper.updatePackageOnMonitoringSuccess(id, monitoringAt);
|
||||
}
|
||||
|
||||
public UserPackage findPackage(Long id) {
|
||||
public UserPackage findPackage(Integer id) {
|
||||
return mapper.findPackage(id);
|
||||
}
|
||||
|
||||
|
|
@ -58,10 +54,6 @@ public class UserPackageService {
|
|||
return mapper.findUserPackages(userId.substring(0, 6), Arrays.stream(status).map(Enum::name).toList());
|
||||
}
|
||||
|
||||
public List<UserPackage> findAllPackagesByUserId(String userId) {
|
||||
return mapper.findAllPackagesByUserId(userId.substring(0, 6));
|
||||
}
|
||||
|
||||
public List<UserPackage> findAllPackagesByStatus(Status status) {
|
||||
return mapper.findAllPackagesByStatus(status.name());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ public class MonitoringReportErrorsStaxtReader extends BaseStaxReader<Monitoring
|
|||
switch (reader.getAttributeLocalName(i)) {
|
||||
case "uid" -> {
|
||||
try {
|
||||
Long uid = Long.parseLong(text);
|
||||
int uid = Integer.parseInt(text);
|
||||
obj.getCurrentPerson().setUid(uid);
|
||||
} catch (NumberFormatException e) {
|
||||
log.error("Couldn't parse uid: {}", text);
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public class OnlineDownloadReportPersonsStaxReader extends BaseStaxReader<Person
|
|||
switch (reader.getAttributeLocalName(i)) {
|
||||
case "uid" -> {
|
||||
try {
|
||||
Long uid = Long.parseLong(text);
|
||||
int uid = Integer.parseInt(text);
|
||||
obj.getCurrentPerson().setUid(uid);
|
||||
} catch (NumberFormatException e) {
|
||||
log.error("Couldn't parse uid: {}", text);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
package ru.nbch.credit_tracker.utils;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
||||
import ru.nbch.credit_tracker.enums.SignalError;
|
||||
|
|
@ -13,52 +10,47 @@ import java.util.regex.Pattern;
|
|||
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class ValidationService {
|
||||
public class ValidationUtil {
|
||||
|
||||
private static final String phoneRegex = "^\\d{9}$";
|
||||
private static final String packageNameRegex = "^[A-Z0-9_]{1,22}$";
|
||||
private static final String npIdRegex = "^\\S{1,36}$";
|
||||
private static String phoneRegex = "^\\d{9}$";
|
||||
private static String packageNameRegex = "^[A-Z0-9_]{1,22}$";
|
||||
private static String npIdRegex = "^\\S{1,36}$";
|
||||
|
||||
@SetAndClearMdc
|
||||
public void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
|
||||
public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
|
||||
if (request == null) {
|
||||
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
if (request.getUserId() == null) {
|
||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId");
|
||||
}
|
||||
|
||||
if (request.getPackageName() == null) {
|
||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName");
|
||||
}
|
||||
|
||||
String packageName = request.getPackageName();
|
||||
|
||||
if (!validatePackageName(request.getPackageName())) {
|
||||
throw clientExcp(SignalError.ERROR_008, packageName, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
if (request.getUserId() == null) {
|
||||
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "UserId");
|
||||
}
|
||||
|
||||
if (request.getPassword() == null) {
|
||||
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "Password");
|
||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password");
|
||||
}
|
||||
|
||||
if (request.getSubjects() == null) {
|
||||
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "Subjects");
|
||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subjects");
|
||||
}
|
||||
|
||||
if (request.getSubjects().getSubject().isEmpty()) {
|
||||
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "Subject");
|
||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subject");
|
||||
}
|
||||
|
||||
if (!validatePackageName(request.getPackageName())) {
|
||||
throw clientExcp(SignalError.ERROR_008, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
|
||||
for (Subject subject : request.getSubjects().getSubject()) {
|
||||
if (!validateNPId(subject.getId())) {
|
||||
throw clientExcp(SignalError.ERROR_010, packageName, XmlErrorFormat.MonitoringError, subject.getId());
|
||||
}
|
||||
if (!validatePhone(subject.getClientId())) {
|
||||
throw clientExcp(SignalError.ERROR_003, packageName, XmlErrorFormat.MonitoringError, subject.getId());
|
||||
throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
if (!validateNPId(subject.getId())) {
|
||||
throw clientExcp(SignalError.ERROR_010, XmlErrorFormat.MonitoringError);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -9,14 +9,10 @@ import ru.nbch.credit_tracker.exceptions.SignalServerException;
|
|||
public class ExceptionUtils {
|
||||
|
||||
public static SignalClientException clientExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Object... args) {
|
||||
return clientExcp(enumKeyCode, null, xmlErrorFormat, args);
|
||||
return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat);
|
||||
}
|
||||
|
||||
public static SignalClientException clientExcp(IEnumKeyCode enumKeyCode, String packageName, XmlErrorFormat xmlErrorFormat, Object... args) {
|
||||
return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat, packageName);
|
||||
}
|
||||
|
||||
public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Exception cause, Object... args) {
|
||||
return new SignalServerException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat, cause);
|
||||
public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Object... args) {
|
||||
return new SignalServerException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ public class SimpleMessageResolver {
|
|||
if(errorMessage.getArgs().length == 0) {
|
||||
return errorMessage.getSubject().getKey();
|
||||
} else {
|
||||
return errorMessage.getSubject().getKey().replace("{}", Arrays.toString(errorMessage.getArgs()));
|
||||
return String.format("%s %s", errorMessage.getSubject().getKey(), Arrays.toString(errorMessage.getArgs()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n</pattern>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
<maxFileSize>100MB</maxFileSize>
|
||||
</triggeringPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n</pattern>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
|
|
|||
|
|
@ -11,45 +11,67 @@
|
|||
</resultMap>
|
||||
|
||||
<select id="findFlagsDebt5000" resultMap="FlagsFidDataResultMap">
|
||||
SELECT
|
||||
FID as fid,
|
||||
(case when (sum(case when AMT_PAST_DUE > 5000 then 1 else 0 end) = 0) then 0 else 1 end) as flag
|
||||
FROM
|
||||
(select FID, AMT_PAST_DUE, rank() over (partition by FID, ACC_SERIAL_NUM order by REPORTED_DT desc) rn
|
||||
FROM RU_PASTDUEARREAR
|
||||
WHERE FID IN
|
||||
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>
|
||||
)
|
||||
where rn=1
|
||||
group by FID
|
||||
WITH UR
|
||||
GROUP BY FID, ACC_SERIAL_NUM) rp
|
||||
GROUP BY rp.FID, rp.ACC_SERIAL_NUM, rp.MAX_REP_DATE
|
||||
</select>
|
||||
|
||||
<select id="findFlag90ByPastDueArrear" resultMap="FlagsFidDataResultMap">
|
||||
SELECT
|
||||
FID as fid,
|
||||
(case when (sum(case when (REPORTED_DT >= #{reportedDate} and DAYS_PAST_DUE > 90) then 1 else 0 end) = 0) then 0 else 1 end) as flag
|
||||
FROM RU_PASTDUEARREAR
|
||||
WHERE FID IN
|
||||
<foreach item="fid" collection="fids" open="(" separator="," close=")">
|
||||
#{fid}
|
||||
</foreach>
|
||||
GROUP BY FID
|
||||
WITH UR
|
||||
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
|
||||
</select>
|
||||
|
||||
<select id="findFlag90ByRuPaymt" resultMap="FlagsFidDataResultMap">
|
||||
SELECT
|
||||
FID as fid,
|
||||
(case when (sum(case when (REPORTED_DT >= #{reportedDate} and DAYS_PAST_DUE > 90) then 1 else 0 end) = 0) then 0 else 1 end) as flag
|
||||
FROM RU_PAYMT
|
||||
WHERE FID IN
|
||||
<foreach item="fid" collection="fids" open="(" separator="," close=")">
|
||||
#{fid}
|
||||
</foreach>
|
||||
GROUP BY FID
|
||||
WITH UR
|
||||
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
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -31,7 +31,6 @@
|
|||
<foreach item="fid" collection="fids" open="(" separator="," close=")">
|
||||
#{fid}
|
||||
</foreach>
|
||||
WITH UR
|
||||
</select>
|
||||
|
||||
<select id="findPassportData" resultMap="passportDataResultMap" resultType="java.util.List">
|
||||
|
|
@ -41,7 +40,6 @@
|
|||
<foreach item="fid" collection="fids" open="(" separator="," close=")">
|
||||
#{fid}
|
||||
</foreach>
|
||||
WITH UR
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
@ -20,6 +20,5 @@
|
|||
#{phone}
|
||||
</foreach>
|
||||
ORDER BY fileSinceDate DESC, fid DESC
|
||||
WITH UR
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -88,11 +88,5 @@
|
|||
where package_id = #{packageId} AND fid is not null
|
||||
</select>
|
||||
|
||||
<select id="hasOldRow" resultType="java.lang.Boolean">
|
||||
select EXISTS(SELECT 1
|
||||
FROM signals_phone_fid_map
|
||||
WHERE package_id = #{packageId}
|
||||
AND calculated_at < now() - make_interval(days => #{daysCount})
|
||||
)
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
@ -11,9 +11,7 @@
|
|||
<result property="packageName" column="package_name"/>
|
||||
<result property="createdAt" column="created_at"/>
|
||||
<result property="status" column="status"/>
|
||||
<result property="deactivatedAt" column="deactivated_at"/>
|
||||
<result property="lastDownloadedReport" column="last_downloaded_report"/>
|
||||
<result property="monitoringAt" column="monitoring_at"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="isPackageNotUnique" resultType="boolean">
|
||||
|
|
@ -52,7 +50,7 @@
|
|||
#{previousStatus}
|
||||
</update>
|
||||
|
||||
<select id="insertPackage" resultType="java.lang.Long"
|
||||
<select id="insertPackage" resultType="java.lang.Integer"
|
||||
parameterType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
INSERT INTO signals_user_packages (membercode, package_name, created_at, status)
|
||||
values (#{userPackage.userId}, #{userPackage.packageName}, #{userPackage.createdAt}, #{userPackage.status}) RETURNING id
|
||||
|
|
@ -70,15 +68,9 @@
|
|||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<update id="updatePackageOnMonitoringSuccess">
|
||||
UPDATE signals_user_packages
|
||||
SET monitoring_at = #{monitoringAt}, status = 'ON_MONITORING'
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<select id="findPackage" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
SELECT id, membercode, package_name, created_at, status, last_downloaded_report
|
||||
FROM signals_user_packages
|
||||
WHERE id = #{id}
|
||||
LIMIT 1
|
||||
|
|
@ -86,7 +78,7 @@
|
|||
|
||||
<select id="findUserPackages" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
SELECT id, membercode, package_name, created_at, status, last_downloaded_report
|
||||
FROM signals_user_packages
|
||||
WHERE membercode IS NOT NULL
|
||||
AND LEFT(membercode, 6) = #{userId}
|
||||
|
|
@ -96,17 +88,9 @@
|
|||
</foreach>
|
||||
</select>
|
||||
|
||||
<select id="findAllPackagesByUserId" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
FROM signals_user_packages
|
||||
WHERE membercode IS NOT NULL
|
||||
AND LEFT(membercode, 6) = #{userId}
|
||||
</select>
|
||||
|
||||
<select id="findAllPackagesByStatus" resultMap="packageDataResultMap"
|
||||
resultType="ru.nbch.credit_tracker.entities.dto.UserPackage">
|
||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
||||
SELECT id, membercode, package_name, created_at, status, last_downloaded_report
|
||||
FROM signals_user_packages
|
||||
WHERE status = #{status}
|
||||
</select>
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
alter table signals_phone_fid_map
|
||||
add error_text text;
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
alter table signals_user_packages
|
||||
add "monitoring_at" timestamp;
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
alter table signals_user_packages
|
||||
alter column id type bigint using id::bigint;
|
||||
|
||||
alter table signals_phone_fid_map
|
||||
alter column id type bigint using id::bigint;
|
||||
|
||||
alter table signals_phone_fid_map
|
||||
alter column package_id type bigint using package_id::bigint;
|
||||
|
||||
alter table signals_hits
|
||||
alter column id type bigint using id::bigint;
|
||||
|
||||
alter table signals_hits
|
||||
alter column package_id type bigint using package_id::bigint;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
CREATE INDEX IF NOT EXISTS
|
||||
idx_signals_phone_fid_map_calculated_at
|
||||
ON signals_phone_fid_map (calculated_at);
|
||||
|
|
@ -6,8 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||
import ru.nbch.credit_tracker.entities.external_response.monitoring_report_error.MonitoringReportErrors;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Person;
|
||||
import ru.nbch.credit_tracker.entities.external_response.online_download.Persons;
|
||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||
|
|
@ -37,7 +35,6 @@ public class StaxTest {
|
|||
List<Supplier<StaxReader<?>>> staxReader = new ArrayList<>();
|
||||
staxReader.add(MonitoringRequestStaxReader::new);
|
||||
staxReader.add(OnlineDownloadReportPersonsStaxReader::new);
|
||||
staxReader.add(MonitoringReportErrorsStaxtReader::new);
|
||||
return new XmlProcessorStaxImpl(staxReader);
|
||||
}
|
||||
}
|
||||
|
|
@ -153,36 +150,4 @@ public class StaxTest {
|
|||
4,
|
||||
"/Report/Persons/Person");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMonitoringReportErrors() {
|
||||
List<PhoneFidMap> subjects = new ArrayList<>();
|
||||
staxXmlProcessor.read(getClass().getResourceAsStream("/monitoring_request/xml/report_errors.xml"), MonitoringReportErrors.class,
|
||||
request -> {
|
||||
if (!request.getPersons().isEmpty()) {
|
||||
List<PhoneFidMap> batch = request.getPersons().stream().map(p -> {
|
||||
return PhoneFidMap.builder()
|
||||
.id(p.getUid())
|
||||
.errorText(p.getValue())
|
||||
.build();
|
||||
}).toList();
|
||||
subjects.addAll(batch);
|
||||
request.getPersons().clear();
|
||||
}
|
||||
},
|
||||
request -> request.getPersons().isEmpty()
|
||||
,
|
||||
3, "/Errors/p");
|
||||
|
||||
Assertions.assertEquals(4, subjects.size());
|
||||
|
||||
Assertions.assertEquals(97821754, subjects.get(0).getId());
|
||||
Assertions.assertEquals("ERROR_TEXT_1", subjects.get(0).getErrorText());
|
||||
Assertions.assertEquals(97821755, subjects.get(1).getId());
|
||||
Assertions.assertEquals("ERROR_TEXT_2", subjects.get(1).getErrorText());
|
||||
Assertions.assertEquals(97821756, subjects.get(2).getId());
|
||||
Assertions.assertEquals("ERROR_TEXT_3", subjects.get(2).getErrorText());
|
||||
Assertions.assertEquals(97821757, subjects.get(3).getId());
|
||||
Assertions.assertEquals("ERROR_TEXT_4", subjects.get(3).getErrorText());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,17 +28,14 @@ import java.util.zip.ZipInputStream;
|
|||
|
||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||
|
||||
@SpringBootTest(classes = {ValidationServiceTest.TestConfig.class})
|
||||
public class ValidationServiceTest {
|
||||
@SpringBootTest(classes = {ValidationUtilTest.TestConfig.class})
|
||||
public class ValidationUtilTest {
|
||||
|
||||
private final StaxXmlProcessor staxXmlProcessor;
|
||||
private final ValidationService validationService;
|
||||
|
||||
@Autowired
|
||||
public ValidationServiceTest(StaxXmlProcessor staxXmlProcessor,
|
||||
ValidationService validationService) {
|
||||
public ValidationUtilTest(StaxXmlProcessor staxXmlProcessor) {
|
||||
this.staxXmlProcessor = staxXmlProcessor;
|
||||
this.validationService = validationService;
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
|
@ -49,11 +46,6 @@ public class ValidationServiceTest {
|
|||
staxReader.add(MonitoringRequestStaxReader::new);
|
||||
return new XmlProcessorStaxImpl(staxReader);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ValidationService validationService() {
|
||||
return new ValidationService();
|
||||
}
|
||||
}
|
||||
|
||||
private static Stream<Arguments> validationTestCases() {
|
||||
|
|
@ -77,12 +69,12 @@ public class ValidationServiceTest {
|
|||
Arguments.of(
|
||||
"/monitoring_request/invalid_phone_request.zip",
|
||||
SignalError.ERROR_003,
|
||||
new Object[]{"abc123"}
|
||||
Collections.emptyList().toArray(new Object[0])
|
||||
),
|
||||
Arguments.of(
|
||||
"/monitoring_request/invalid_id_request.zip",
|
||||
SignalError.ERROR_010,
|
||||
new Object[]{"#####"}
|
||||
Collections.emptyList().toArray(new Object[0])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
@ -115,7 +107,7 @@ public class ValidationServiceTest {
|
|||
|
||||
if(ex == null) {
|
||||
try {
|
||||
validationService.validateMonitoringRequest(monitoringRequest);
|
||||
ValidationUtil.validateMonitoringRequest(monitoringRequest);
|
||||
} catch (SignalClientException e) {
|
||||
ex = e;
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Errors>
|
||||
<Id>0001XX_MY_BATCH_223112</Id>
|
||||
<Version>1</Version>
|
||||
<User>0001ZZ000001</User>
|
||||
<ReportCreated>11.09.2025 11:05:29</ReportCreated>
|
||||
<p uid="97821754">ERROR_TEXT_1
|
||||
</p>
|
||||
<p uid="97821755">ERROR_TEXT_2
|
||||
</p>
|
||||
<p uid="97821756">ERROR_TEXT_3
|
||||
</p>
|
||||
<p uid="97821757">ERROR_TEXT_4
|
||||
</p>
|
||||
</Errors>
|
||||
Loading…
Add table
Reference in a new issue