From 30a9c39726f6d6adacfea9af291893f1391dc0c8 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 12 Jan 2023 19:04:59 +0300 Subject: [PATCH 01/18] =?UTF-8?q?backend-api=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D0=B0=20GREP=20=D0=B4=D0=BB=D1=8F=20reports-servic?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../queue/scheduler/LauncherController.java | 18 ++++++++--------- .../request/cud/schedule/LauncherNew.java | 20 +++++++++++++------ .../reports/services/QCommandExecutor.java | 2 +- .../reports/services/collector/MapUtil.java | 2 +- .../ru/spcex/platform/enumeration/Task.java | 2 +- 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java index f5429d6c9..5d123699e 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java @@ -81,20 +81,20 @@ public class LauncherController extends AbstractQueueController { } launcherCommand.setTask(dictionaryName); launcherCommand.setUserId(user.getId()); - //пока здесь - saveLauncher(dictionaryName, user.getId()); +// //пока здесь +// saveLauncher(dictionaryName, user.getId()); //топики ограничиваются наличием в taskDictionary //подписываются на разные топики в разных модулях, см. ru.spcex.platform.enumeration.Task#topic return processRequest("launcher-" + dictionaryName, launcherCommand); } - private void saveLauncher(String taskCode, Long userId) { - Launcher launcherCommandHistory = new Launcher(); - launcherCommandHistory.setTask(taskCode); - launcherCommandHistory.setSenderId(userId); - launcherCommandHistory.setCreated(Instant.now()); - launcherImdg.insert(launcherCommandHistory); - } +// private void saveLauncher(String taskCode, Long userId) { +// Launcher launcherCommandHistory = new Launcher(); +// launcherCommandHistory.setTask(taskCode); +// launcherCommandHistory.setSenderId(userId); +// launcherCommandHistory.setCreated(Instant.now()); +// launcherImdg.insert(launcherCommandHistory); +// } @Autowired private IMessageResolver errorResolver; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java index 76b301904..ce810d0e8 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/LauncherNew.java @@ -6,14 +6,16 @@ import io.swagger.annotations.ApiModelProperty; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportWithPeriodRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.utils.enumeration.EnumMessage; import java.util.Collection; import java.util.Collections; import java.util.List; -public class LauncherNew implements IAction { +public class LauncherNew implements IAction { @ApiModelProperty(value = "Идентификатор единоличного исполнительного органа", example = "ABCD") @JsonProperty private String task; @@ -22,11 +24,17 @@ public class LauncherNew implements IAction { private Long userId; @Override - public LauncherCommandRequest toRequest() { - LauncherCommandRequest taskRunnerCommandRequest = new LauncherCommandRequest(); - taskRunnerCommandRequest.setTaskName(task); - taskRunnerCommandRequest.setUserId(userId); - return taskRunnerCommandRequest; + public Object toRequest() { + if (Task.createReport_GREP.equalsByKey(task)) { + ReportWithPeriodRequest reportCommand = new ReportWithPeriodRequest(); + reportCommand.setReportId(task); + return reportCommand; + } else { + LauncherCommandRequest taskRunnerCommandRequest = new LauncherCommandRequest(); + taskRunnerCommandRequest.setTaskName(task); + taskRunnerCommandRequest.setUserId(userId); + return taskRunnerCommandRequest; + } } @Override diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java index 78adaec08..021bbc884 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -42,7 +42,7 @@ public class QCommandExecutor extends QueueConsumer implements InitializingBean log.info("Init queue listener {}", getClass().getSimpleName()); callback(ReportWithPeriodRequest.class) .setConsumer(this::newReportWithPeriod) - .forDestination(Task.createReport.topic(), callbacks::put); + .forDestination(Task.createReport_GREP.topic(), callbacks::put); init(); } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java index e49ff0ca6..621868c9b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java @@ -27,7 +27,7 @@ public class MapUtil { K key = indexFieldExtractor.apply(obj); V exist = index.put(key, obj); if (exist != null) { - throw new IllegalStateException(String.format("%s with id=%s,%s has duplicate key=\"{}\"", + throw new IllegalStateException(String.format("%s with id=%s,%s has duplicate key=\"%s\"", exist.getClass().getSimpleName(), exist.getId(), obj.getId(), key )); } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index 3d5a6ddcd..792cdbe0c 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -15,7 +15,7 @@ public enum Task implements IEnumKey { createOrder("CORD"), createOrderConfirm("CORC"), getAllBalance("GALB"), - createReport("RPRT");// Создание отчёта (report-service) + createReport_GREP("GREP");// Создание отчёта (report-service) RPRT нескольких видов, этот GREP private final String key; From 62abb0d58b74a0f0469459d02f244689985f7141 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 11:14:14 +0300 Subject: [PATCH 02/18] =?UTF-8?q?reports-service=20=20=D0=BF=D0=BE=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=B8=D0=BB=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20=D0=B8=D0=B7=20jar=20(=D0=BD=D0=B5=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B3=20=D0=BF=D1=80=D0=BE=D1=87=D0=B8=D1=82=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81=D1=8B=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D1=84=D0=B0=D0=B9=D0=BB),=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=82=D0=BE=D0=BC=D0=BA=D0=B0=D1=82=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=20(=D1=82=D0=B0=D0=BA=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0-=D1=82=D0=BE=20=D0=B1=D1=8B?= =?UTF-8?q?=D0=BB=D0=BE=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20=D0=BB=D0=B5=D1=82=20=D0=BD=D0=B0=D0=B7=D0=B0=D0=B4=20?= =?UTF-8?q?=D1=81=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=BC=20rep?= =?UTF-8?q?ort-srvc)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/reports-service/pom.xml | 6 ++++++ clearing-parent/reports-service/readme.md | 7 ++++++- .../notifications/NotificationBuilder.java | 17 +++++++++-------- .../clearing/reports/services/DOCXService.java | 14 ++++++++------ .../src/main/resources/application.properties | 3 --- .../reports/services/DOCXServiceTest.java | 2 +- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 457291ada..969ee84ed 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -24,6 +24,12 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + org.springframework.boot diff --git a/clearing-parent/reports-service/readme.md b/clearing-parent/reports-service/readme.md index 995cd56a8..4ab9323ef 100644 --- a/clearing-parent/reports-service/readme.md +++ b/clearing-parent/reports-service/readme.md @@ -48,4 +48,9 @@ DAILY - все ежедневные reports-service.kafka-consumer - группа настроек для подключения к очереди kafka -и другие настройки. \ No newline at end of file +и другие настройки. + +Рабочие папки +------------- + +* Из настройки reports-service.ReportModuleOut=./report_out - путь к папке для результатов генерации отчётов diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java index 56cdad6b8..9773f4a1e 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java @@ -1,19 +1,20 @@ package ru.spcex.clearing.reports.notifications; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.spcex.clearing.reports.exceptions.ConfigException; import ru.spcex.clearing.reports.services.DOCXService; import java.io.File; import java.net.URL; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.TextStyle; -import java.util.HashMap; import java.util.Locale; import java.util.Map; public abstract class NotificationBuilder { + protected final Logger log = LoggerFactory.getLogger(getClass()); protected final DateTimeFormatter filenameDateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); protected final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); protected final DOCXService docxService; @@ -41,17 +42,17 @@ public abstract class NotificationBuilder { } - protected File getTemplateFile() { - File templateFile; + protected URL getTemplateFile() { String templateResourceName = getTemplateResourceName(); + URL resource = null; try { - URL resource = getClass().getClassLoader().getResource(templateResourceName); + resource = getClass().getClassLoader().getResource(templateResourceName); if (resource == null) throw new Exception(); - templateFile = new File(resource.toURI()); } catch (Exception e) { - throw new ConfigException("Can't read template resource " + templateResourceName, e); + throw new ConfigException("Can't read template resource " + templateResourceName +" (URL \""+resource+"\")", e); } - return templateFile; + log.info("Use resource: {}", resource); + return resource; } protected String normalizeFilenameForOS(String filename) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java index 02e1813eb..67cd092ea 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; +import java.net.URL; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -43,7 +44,7 @@ public class DOCXService { /** * Файл шаблона */ - private File templateFile; + private URL templateFile; /** * Флаг инициализации @@ -53,13 +54,14 @@ public class DOCXService { /** * (ре)Инициализация сервиса */ - public boolean init(File templateFile, String keyPattern) { + public boolean init(URL templateFile, String keyPattern) { initialized = false; - if (templateFile == null || !templateFile.exists() || !templateFile.isFile()) { - log.warn("Invalid templateFile"); + if (templateFile == null /*|| !templateFile.exists() || !templateFile.isFile()*/) { + log.warn("Invalid templateFile {}", templateFile); return false; } this.templateFile = templateFile; + log.debug("{} use template from {}", getClass().getSimpleName(), templateFile); if (keyPattern != null) { try { this.keyPattern = Pattern.compile(keyPattern); @@ -108,7 +110,7 @@ public class DOCXService { } } - try (InputStream inputStream = new FileInputStream(templateFile); + try (InputStream inputStream = templateFile.openStream(); //new FileInputStream(templateFile); OutputStream outputStream = new FileOutputStream(outputFile)) { XWPFDocument doc = new XWPFDocument(inputStream); @@ -125,7 +127,7 @@ public class DOCXService { boolean checkOk = checkIntersection(valuesMap, notPresentInMap); if (!checkOk) { log.error("Can't insert values in file {}. Keys not in map: {}.", - templateFile.getAbsolutePath(), + templateFile.toExternalForm()/*templateFile.getAbsolutePath()*/, String.join(", ", notPresentInMap)); return false; } diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index ffa1ebe50..ed2aa2053 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -1,6 +1,3 @@ -server.port=8080 -server.servlet.context-path=/reports_service -spring.main.web-application-type=servlet reports-service.kafka-consumer.bootstrap-servers=localhost:9092 diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java index ffd640744..2cfff9e9d 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java @@ -19,7 +19,7 @@ class DOCXServiceTest { valuesMap.put("${test3}", "======== TEST 3 ========="); DOCXService service = new DOCXService(); - service.init(new File(getClass().getClassLoader().getResource("REC.ACTV_TEST.docx").getPath()), null); + service.init(getClass().getClassLoader().getResource("REC.ACTV_TEST.docx"), null); service.insertValues(new File("output.docx"), valuesMap, false); From 12479c89b724dcffe7b03168fce28213fc0c382d Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 13 Jan 2023 14:00:27 +0300 Subject: [PATCH 03/18] fix crud operations on BankAccount --- clearing-parent/account-service/pom.xml | 4 + .../account/config/ErrorResolverConfig.java | 14 ++++ .../clearing/account/errors/AccountError.java | 17 ++++ .../account/service/BankAccountService.java | 80 +++++++++++++++++-- .../service/BankAccountServiceTest.java | 15 +++- .../platform/enumeration/AccountStatus.java | 18 +++++ .../spcex/platform/enumeration/Allowed.java | 18 +++++ .../spcex/platform/enumeration/Service.java | 18 +++++ .../cud/account/BankAccountNewRequest.java | 20 ++--- 9 files changed, 184 insertions(+), 20 deletions(-) create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java create mode 100644 clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index ddbf3d9d1..aa06e621d 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -24,6 +24,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.platform + platform-enum + ru.spcex.clearing classes diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java new file mode 100644 index 000000000..7cf2db17a --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/ErrorResolverConfig.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.account.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; + +@Configuration +public class ErrorResolverConfig { + @Bean + public IMessageResolver messageResolver() { + return new SimpleMessageResolver(); + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java new file mode 100644 index 000000000..76dc0ac4b --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.account.errors; + +import ru.spcex.platform.utils.enumeration.IEnumId; + +public enum AccountError implements IEnumId { + AccountAlreadyExist(5010L); + private final Long id; + + AccountError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 3c1ad9ed6..134d2cfc4 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -7,7 +7,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -15,36 +18,67 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.platform.enumeration.AccountStatus; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.Allowed; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +import java.time.Instant; +import java.util.Collection; @Service public class BankAccountService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg bankAccountMap; + private final Imdg accountMap; + private final Imdg relationMap; + private final IMessageResolver messageResolver; @Autowired - public BankAccountService(Consumer kafkaQueue, Producer kafkaProducer, ImdgProvider imdgProvider) { + public BankAccountService(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + IMessageResolver messageResolver) { super(kafkaQueue, kafkaProducer); this.bankAccountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); + this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.relationMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + this.messageResolver = messageResolver; } @Override public void afterPropertiesSet() { callback(BankAccountNewRequest.class) - .setConsumer(this::bankAccountNew) + .setFunction(this::bankAccountNew) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_NEW, callbacks::put); callback(BankAccountUpdateRequest.class) - .setConsumer(this::bankAccountUpdate) + .setFunction(this::bankAccountUpdate) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::bankAccountDelete) + .setFunction(this::bankAccountDelete) .forDestination(Consts.DESTINATION_BANK_ACCOUNT_DELETE, callbacks::put); init(); } - private void bankAccountNew(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountNew(BaseRequest userRequest) { BankAccountNewRequest req = userRequest.getRequestPayload(); + + Collection accountsByKey = + accountMap.getCollectionObjectsBySQL(String.format("account = %s", req.account)); + if (!accountsByKey.isEmpty()) { + String errorMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountAlreadyExist)); + log.error("cannot process MoneyMarketSecurityNewRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + log.debug("BankAccountNewRequest received"); BankAccount bankAccount = new BankAccount(); bankAccount.setBankIdentificationCode(req.getBankIdentificationCode()); @@ -57,11 +91,31 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); + Account account = new Account(); + account.setAccount(req.account); + account.setAccountType(AccountType.Bank.getKey()); + + String relationSqlCondition = String.format("consumerId = %s and service = %s", req.companyId, + ru.spcex.platform.enumeration.Service.MKR.getKey()); + Relation relationByCompany = relationMap.getSingleObjectBySQL(relationSqlCondition); + if (relationByCompany != null) { + account.setRelationId(relationByCompany.getId()); + account.setCompanyId(relationByCompany.getConsumerId()); + } else { + log.warn("Not found relation by condition: {}", relationSqlCondition); + } + account.setAccountStatus(AccountStatus.ACTIVE.getKey()); + account.setProcessingSign(Allowed.ALLOWED.getKey()); + account.setCreated(Instant.now()); + account.setUpdated(Instant.now()); + + accountMap.insert(account); bankAccountMap.insert(bankAccount); log.debug("successfully processed, new id {}", bankAccount.getId()); + return null; } - private void bankAccountUpdate(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountUpdate(BaseRequest userRequest) { BankAccountUpdateRequest req = userRequest.getRequestPayload(); log.debug("BankAccountUpdateRequest received id = {}", req.getId()); BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId()); @@ -75,17 +129,29 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); + Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId()); + account.setAccount(req.account); + account.setUpdated(Instant.now()); + + accountMap.update(account); bankAccountMap.update(bankAccount); log.debug("successfully update, existing bankAccount with id {}", bankAccount.getId()); + return null; } - private void bankAccountDelete(BaseRequest userRequest) { + private RequestInfoUpdate bankAccountDelete(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); log.debug("CommonDeleteRequest received id = {}", req.getId()); BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId()); + Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId()); + account.setAccountStatus(AccountStatus.BLOCKED.getKey()); + account.setUpdated(Instant.now()); + + accountMap.update(account); bankAccountMap.delete(bankAccount); log.debug("successfully delete, existing bankAccount with id {}", bankAccount.getId()); + return null; } } diff --git a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java index 6060126ce..ed1a44667 100644 --- a/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java +++ b/clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/BankAccountServiceTest.java @@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.account.BankAccount; +import ru.spcex.clearing.account.config.ErrorResolverConfig; import ru.spcex.clearing.account.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.account.utils.MatcherFactory.Matcher; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -27,6 +28,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.util.Collections; import java.util.HashMap; @@ -35,7 +37,7 @@ import static ru.spcex.clearing.account.utils.MatcherFactory.usingIgnoringFields @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { - HazelcastServiceTestConfiguration.class}) + HazelcastServiceTestConfiguration.class, ErrorResolverConfig.class}) public class BankAccountServiceTest { public static final Matcher BANK_ACCOUNT_MATCHER = usingIgnoringFieldsComparator(); private static final int PARTITION = 0; @@ -47,6 +49,8 @@ public class BankAccountServiceTest { @Autowired @Qualifier("hazelcastServiceTest") private HazelcastService hazelcastServiceTest; + @Autowired + private IMessageResolver messageResolver; private MockConsumer mockConsumer; private MockProducer mockProducer; @@ -120,7 +124,8 @@ public class BankAccountServiceTest { //ACT //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, + hazelcastServiceTest, messageResolver); Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); @@ -221,7 +226,8 @@ public class BankAccountServiceTest { //ACT //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, + hazelcastServiceTest, messageResolver); Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); @@ -305,7 +311,8 @@ public class BankAccountServiceTest { //ACT //service set up - BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, hazelcastServiceTest); + BankAccountService bankAccountService = new BankAccountService(mockConsumer, mockProducer, + hazelcastServiceTest, messageResolver); Thread.sleep(10000); //callbacks set up bankAccountService.afterPropertiesSet(); diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java new file mode 100644 index 000000000..d6bc9d22d --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountStatus.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum AccountStatus implements IEnumKey { + ACTIVE("ACTV"), BLOCKED("BLKD"), CLOSE("CLOS"); + + private final String key; + + AccountStatus(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java new file mode 100644 index 000000000..77cc2acac --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Allowed.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Allowed implements IEnumKey { + ALLOWED("ALWD"), DENIED("DEND"); + + private final String key; + + Allowed(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java new file mode 100644 index 000000000..2fd271c0a --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Service.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Service implements IEnumKey { + MKR("MKR"); + + private final String key; + + Service(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java index 527ed2ce4..4d7300722 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java @@ -4,23 +4,25 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class BankAccountNewRequest { @JsonProperty - public String bankIdentificationCode;//Банковский идентификационный код (БИК) + public String bankIdentificationCode; @JsonProperty - public String bankName;//Наименование банка + public String bankName; @JsonProperty - public String correspondentAccount;//Корреспондентский счет + public String correspondentAccount; @JsonProperty - public String correspondentAccountName;//Наименование корреспондентского счета + public String correspondentAccountName; @JsonProperty - public String currency;//Идентификатор валюты + public String currency; @JsonProperty - public String destination;//Назначение + public String destination; @JsonProperty - public String taxpayerIdentificationNumber;//Идентификационный номер налогоплательщика (ИНН) + public String taxpayerIdentificationNumber; @JsonProperty - public String taxRegistrationReasonCode;//Код причины постановки (КПП) + public String taxRegistrationReasonCode; @JsonProperty - public String account;//Номер счета + public String account; + @JsonProperty + public Long companyId; public String getBankIdentificationCode() { return bankIdentificationCode; From 1f959be4f5e6303b9d19dc2b70b5db0e73191df3 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 14:19:03 +0300 Subject: [PATCH 04/18] =?UTF-8?q?launcher-service=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D0=BB=20dcbdea0abfacd23cc8e106f2ece89b820cb0fc51?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../queue/scheduler/LauncherController.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java index 5d123699e..a6e7bb993 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java @@ -81,20 +81,20 @@ public class LauncherController extends AbstractQueueController { } launcherCommand.setTask(dictionaryName); launcherCommand.setUserId(user.getId()); -// //пока здесь -// saveLauncher(dictionaryName, user.getId()); + // пока здесь, это требуется для сохранения истории + saveLauncher(dictionaryName, user.getId()); //топики ограничиваются наличием в taskDictionary //подписываются на разные топики в разных модулях, см. ru.spcex.platform.enumeration.Task#topic return processRequest("launcher-" + dictionaryName, launcherCommand); } -// private void saveLauncher(String taskCode, Long userId) { -// Launcher launcherCommandHistory = new Launcher(); -// launcherCommandHistory.setTask(taskCode); -// launcherCommandHistory.setSenderId(userId); -// launcherCommandHistory.setCreated(Instant.now()); -// launcherImdg.insert(launcherCommandHistory); -// } + private void saveLauncher(String taskCode, Long userId) { + Launcher launcherCommandHistory = new Launcher(); + launcherCommandHistory.setTask(taskCode); + launcherCommandHistory.setSenderId(userId); + launcherCommandHistory.setCreated(Instant.now()); + launcherImdg.insert(launcherCommandHistory); + } @Autowired private IMessageResolver errorResolver; From 98028949b52c7be4a832546351cb3796e5b2f481 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 14:29:34 +0300 Subject: [PATCH 05/18] =?UTF-8?q?dbf-importer=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=81=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9=20=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B5=20Task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/LauncherCommandReceiver.java | 16 +++++++++++++++- .../java/ru/spcex/platform/enumeration/Task.java | 5 ++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/LauncherCommandReceiver.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/LauncherCommandReceiver.java index eec3f4f88..d79c3a9b9 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/LauncherCommandReceiver.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/LauncherCommandReceiver.java @@ -10,6 +10,7 @@ import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.utils.log.ExceptionUtils; @Service public class LauncherCommandReceiver extends QueueConsumer implements InitializingBean { @@ -27,7 +28,20 @@ public class LauncherCommandReceiver extends QueueConsumer implements Initializi public void afterPropertiesSet() { callback(LauncherCommandRequest.class) .setConsumer(action -> importer.run(ETable.DF_04)) - .forDestination(Task.createOrderConfirm.topic(), callbacks::put); + .forDestination(Task.createOrderConfirm.topic(), callbacks::put); // CORC + callback(LauncherCommandRequest.class) + .setConsumer(action -> importer.run(ETable.DF_01)) + .forDestination(Task.dbf_GBAL.topic(), callbacks::put); // GBAL + callback(LauncherCommandRequest.class) + .setConsumer(action -> importer.run(ETable.DF_12)) + .forDestination(Task.dbf_ABLK.topic(), callbacks::put); // ABLK + callback(LauncherCommandRequest.class) + .setConsumer(action -> importer.run(ETable.DF_09)) + .forDestination(Task.dbf_GBLD.topic(), callbacks::put); // GBLD + callback(LauncherCommandRequest.class) + .setConsumer(action -> importer.run(ETable.DF_16)) + .forDestination(Task.dbf_ADBL.topic(), callbacks::put); // ADBL + init(); } } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index 792cdbe0c..edc28722a 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -13,11 +13,14 @@ public enum Task implements IEnumKey { startOfPreClearing("SPRC"),// Запуск преклиринга startPostClearing("SPOC"),// Запуск постклиринга createOrder("CORD"), + dbf_GBAL("GBAL"), + dbf_ABLK("ABLK"), + dbf_GBLD("GBLD"), + dbf_ADBL("ADBL"), createOrderConfirm("CORC"), getAllBalance("GALB"), createReport_GREP("GREP");// Создание отчёта (report-service) RPRT нескольких видов, этот GREP - private final String key; Task(String key) { From cfbd12ccc5ef0290fbffc3abf0c8b179ec4fe809 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 15:36:52 +0300 Subject: [PATCH 06/18] =?UTF-8?q?dbf-exporter=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20S=5FDF08=5FConverter.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/dbf-exporter/pom.xml | 6 ++++++ .../services/converters/S_DF08_Converter.java | 21 ++++++++++++++++--- .../converters/S_DF08_ConverterTest.java | 21 +++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index fc2108169..38a9693ab 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -50,6 +50,12 @@ classes + + + org.testng + testng + test + diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java index 62db8cea1..06489e248 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java @@ -5,6 +5,9 @@ import com.linuxense.javadbf.DBFField; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.sdf.SDf08; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.LinkedList; import java.util.List; @@ -14,7 +17,7 @@ public class S_DF08_Converter extends DFConverter { public Object[] toObjectArray(SDf08 entity) { List values = new LinkedList<>(); values.add(convertStrToLong(entity.getNumber())); - values.add(convertStrToLong(entity.getDatetime())); + values.add(typeMatch(entity.getDatetime())); return values.toArray(Object[]::new); } @@ -22,12 +25,24 @@ public class S_DF08_Converter extends DFConverter { public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 10)); - dbfFields.add(new DBFField("DATETIME", DBFDataType.NUMERIC, 13)); + dbfFields.add(new DBFField("DATETIME", DBFDataType.DATE)); return dbfFields.toArray(DBFField[]::new); } - private Long convertStrToLong(String s) { + Long convertStrToLong(String s) { if (s == null) return null; return Long.valueOf(s); } + + private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + private static final DateTimeFormatter DATE_TIME_FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); + + Object convertStrToDate(String s) { + if (s == null) return null; + if (s.matches("\\d{2}.\\d{2}.\\d{4}")) { + return typeMatch(LocalDate.parse(s, DATE_FMT)); + } else { + return typeMatch(LocalDateTime.parse(s, DATE_TIME_FMT)); + } + } } diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java new file mode 100644 index 000000000..91dace992 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.dbf.exporter.services.converters; + +import org.testng.Assert; +import org.testng.annotations.Test; + +public class S_DF08_ConverterTest { + @Test + public void testTestConvertStrToLong() { + S_DF08_Converter converter = new S_DF08_Converter(); + Assert.assertNull(converter.convertStrToLong(null)); + Assert.assertEquals(1L, converter.convertStrToLong("1")); + } + + @Test + public void testTestConvertStrToDate() { + S_DF08_Converter converter = new S_DF08_Converter(); + Assert.assertNull(converter.convertStrToDate(null)); + Assert.assertEquals("2022-12-29", converter.convertStrToDate("29.12.2022").toString()); + Assert.assertEquals("2023-01-13T15:32:01", converter.convertStrToDate("13.01.2023 15:32:01").toString()); + } +} \ No newline at end of file From fce1b1d28bcba3e133594ae750a4d32418e49c2e Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 13 Jan 2023 16:12:49 +0300 Subject: [PATCH 07/18] fix crud operations on BankAccount --- .../ru/spcex/clearing/account/service/BankAccountService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index 134d2cfc4..cd8817ca8 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -110,6 +110,8 @@ public class BankAccountService extends QueueConsumer implements InitializingBea account.setUpdated(Instant.now()); accountMap.insert(account); + + bankAccount.setAccountId(account.getId()); bankAccountMap.insert(bankAccount); log.debug("successfully processed, new id {}", bankAccount.getId()); return null; From a58ef60c99f4e0d9ce6406e77dcdf93e4edf877a Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 16:40:22 +0300 Subject: [PATCH 08/18] =?UTF-8?q?balance-service=20sfd16=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=20inn,bic=20=D1=82.=D0=BA.=20=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=20=D0=BF=D0=BE=D1=87=D0=B5=D0=BC=D1=83=D1=82=D0=BE=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=BB=D0=B0=D0=B2=D0=B0=D1=8E=D1=89=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=8F=D1=82=D0=BE=D0=B9=20=D0=B1=D1=8B?= =?UTF-8?q?=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/balance/validation/Sdf16ValidationRule.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java index 69bdeb806..679603699 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java @@ -11,6 +11,7 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; +import java.math.RoundingMode; import java.util.Optional; public enum Sdf16ValidationRule implements IValidationRule> { @@ -20,10 +21,12 @@ public enum Sdf16ValidationRule implements IValidationRule companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + String innStr = sdf16.getInn().setScale(0, RoundingMode.DOWN).toString(); + String bicStr = sdf16.getBic().setScale(0, RoundingMode.DOWN).toString(); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectBySQL( String.format("(companySymbolValue = '%s' and companySymbol = '%s') " + "or (companySymbolValue = '%s' and companySymbol = '%s')", - sdf16.getInn(), CompanySymbol.INN.getKey(), sdf16.getBic(), CompanySymbol.BIC.getKey())); + innStr, CompanySymbol.INN.getKey(), bicStr, CompanySymbol.BIC.getKey())); Company company = null; if (companySymbols != null) { company = companyImdg.getSingleObjectByID(companySymbols.getCompanyId()); From 565ea49cdb0fa0101ca2ebae393b5309c91bd02a Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Fri, 13 Jan 2023 16:47:57 +0300 Subject: [PATCH 09/18] fix BalanceError --- .../java/ru/spcex/clearing/balance/errors/BalanceError.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java index bc93391a6..773623c19 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java @@ -7,7 +7,7 @@ public enum BalanceError implements IEnumId { CurrencyNotFound(5213L), CurrentDateOnly(5214L), WrongMarket(5215L), - WrongAccount(5215L), + WrongAccount(5216L), AccountNotPresent(5217L), AccountNotActive(5218L), BalanceNotEnough(5222L), From 5b529484a5b769b8f5219a900f3479523ba67ab2 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 17:21:56 +0300 Subject: [PATCH 10/18] =?UTF-8?q?balance-service=20sfd09=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=20inn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../balance/validation/Sdf01ValidationRule.java | 1 - .../balance/validation/Sdf09ValidationRule.java | 10 +++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java index c783e57d3..120cb137a 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java @@ -58,7 +58,6 @@ public enum Sdf01ValidationRule implements IValidationRule validate(ImdgValidationContext context) { SDf01 sdf01 = context.getValidatedObject(); - //fixme string format??? if (!LocalDate.now().equals(LocalDate.parse(sdf01.getDat(), datFormatter))) { return of(BalanceError.CurrentDateOnly); } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java index 5daf7d4a6..c707de1b4 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java @@ -13,6 +13,7 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; +import java.math.RoundingMode; import java.util.Map; import java.util.Optional; @@ -23,11 +24,14 @@ public enum Sdf09ValidationRule implements IValidationRule companySymbolImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + String innStr = sdf09.getInn().setScale(0, RoundingMode.DOWN).toString(); CompanySymbols symbol = companySymbolImdg .getSingleObjectByFieldValues(Map.of("companySymbol", CompanySymbol.INN.getKey(), - "companySymbolValue", sdf09.getInn())); - Company company = companyImdg.getSingleObjectByID(symbol.getCompanyId()); - + "companySymbolValue", innStr)); + Company company = null; + if (symbol != null) { + company = companyImdg.getSingleObjectByID(symbol.getCompanyId()); + } if (company == null) { return of( BalanceError.CompanyNotFound); } From f6a60c023cc2571f33dc5ca5b2ad968b7c86783b Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 18:46:56 +0300 Subject: [PATCH 11/18] =?UTF-8?q?dbf-export=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83?= =?UTF-8?q?=20=D1=81=20IMDG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logic/stages/ExportFromHazelcast.java | 3 ++- .../dbf/exporter/services/DBFExportService.java | 15 ++++++++++++++- .../services/converters/S_DF08_Converter.java | 7 ++++--- .../services/converters/S_DF08_ConverterTest.java | 4 ++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java index c67363f54..a2bebeafc 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java @@ -100,7 +100,8 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { writeOk = true; emptyMap = tableRows.isEmpty(); } catch (Exception e) { - log.error(String.format("uuid %s. Can't export table %s to file %s. Table was skipped.", resultContainer.getUuid(), table, dbfFile), e); + log.error(String.format("uuid %s. Can't export table %s (map %s) to file %s. Table was skipped.", + resultContainer.getUuid(), table, table.getHazelcastMapName(), dbfFile), e); return StageResult.ERROR; } finally { if (!writeOk || emptyMap) { diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java index 53dc19b56..3371e1c72 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java @@ -1,24 +1,37 @@ package ru.spcex.clearing.dbf.exporter.services; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import ru.spcex.clearing.dbf.exporter.logic.Processor; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Arrays; @Service("dbfExportService") public class DBFExportService { + Logger log = LoggerFactory.getLogger(getClass()); private final ThreadPoolTaskExecutor executor; private final Processor processor; + protected final ImdgProvider imdgProvider; public DBFExportService(@Qualifier("executor") ThreadPoolTaskExecutor executor, - @Qualifier("processor") Processor processor) { + @Qualifier("processor") Processor processor, + ImdgProvider imdgProvider) { this.executor = executor; this.processor = processor; + this.imdgProvider = imdgProvider; + log.debug("Check IMDG..."); + imdgProvider.waitAvailable(); + log.debug("IMDG ready..."); } public void run() { + log.debug("Do export for all: {}", Arrays.toString(Table.values())); for (Table tableForExport : Table.values()) { executor.submit(() -> processor.process(ResultContainer.createNewTask(tableForExport))); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java index 06489e248..0166fbf06 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java @@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.sdf.SDf08; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.LinkedList; import java.util.List; @@ -17,7 +18,7 @@ public class S_DF08_Converter extends DFConverter { public Object[] toObjectArray(SDf08 entity) { List values = new LinkedList<>(); values.add(convertStrToLong(entity.getNumber())); - values.add(typeMatch(entity.getDatetime())); + values.add(typeMatch(convertStrToDate(entity.getDatetime()))); return values.toArray(Object[]::new); } @@ -40,9 +41,9 @@ public class S_DF08_Converter extends DFConverter { Object convertStrToDate(String s) { if (s == null) return null; if (s.matches("\\d{2}.\\d{2}.\\d{4}")) { - return typeMatch(LocalDate.parse(s, DATE_FMT)); + return LocalDate.parse(s, DATE_FMT).atStartOfDay(ZoneId.systemDefault()).toInstant(); } else { - return typeMatch(LocalDateTime.parse(s, DATE_TIME_FMT)); + return LocalDateTime.parse(s, DATE_TIME_FMT).atZone(ZoneId.systemDefault()).toInstant(); } } } diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java index 91dace992..10de36001 100644 --- a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java @@ -15,7 +15,7 @@ public class S_DF08_ConverterTest { public void testTestConvertStrToDate() { S_DF08_Converter converter = new S_DF08_Converter(); Assert.assertNull(converter.convertStrToDate(null)); - Assert.assertEquals("2022-12-29", converter.convertStrToDate("29.12.2022").toString()); - Assert.assertEquals("2023-01-13T15:32:01", converter.convertStrToDate("13.01.2023 15:32:01").toString()); + Assert.assertEquals("2022-12-29 00:00:00.0", converter.convertStrToDate("29.12.2022").toString()); + Assert.assertEquals("2023-01-13 15:32:01.0", converter.convertStrToDate("13.01.2023 15:32:01").toString()); } } \ No newline at end of file From f85baa98001debd2e623bd1f3fcc99ef0a48b69d Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 19:04:11 +0300 Subject: [PATCH 12/18] =?UTF-8?q?dbf-export=20=D1=8D=D1=82=D0=BE=20uNIX=20?= =?UTF-8?q?time!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/dbf-exporter/pom.xml | 6 ------ .../services/converters/S_DF08_Converter.java | 15 ++----------- .../converters/S_DF08_ConverterTest.java | 21 ------------------- 3 files changed, 2 insertions(+), 40 deletions(-) delete mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 38a9693ab..fc2108169 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -50,12 +50,6 @@ classes - - - org.testng - testng - test - diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java index 0166fbf06..516c4736a 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java @@ -5,9 +5,6 @@ import com.linuxense.javadbf.DBFField; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.sdf.SDf08; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.LinkedList; import java.util.List; @@ -18,7 +15,7 @@ public class S_DF08_Converter extends DFConverter { public Object[] toObjectArray(SDf08 entity) { List values = new LinkedList<>(); values.add(convertStrToLong(entity.getNumber())); - values.add(typeMatch(convertStrToDate(entity.getDatetime()))); + values.add(typeMatch(convertStrToLong(entity.getDatetime()))); // UNIX TIME return values.toArray(Object[]::new); } @@ -26,7 +23,7 @@ public class S_DF08_Converter extends DFConverter { public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 10)); - dbfFields.add(new DBFField("DATETIME", DBFDataType.DATE)); + dbfFields.add(new DBFField("DATETIME", DBFDataType.NUMERIC, 13)); // UNIX TIME return dbfFields.toArray(DBFField[]::new); } @@ -38,12 +35,4 @@ public class S_DF08_Converter extends DFConverter { private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy"); private static final DateTimeFormatter DATE_TIME_FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); - Object convertStrToDate(String s) { - if (s == null) return null; - if (s.matches("\\d{2}.\\d{2}.\\d{4}")) { - return LocalDate.parse(s, DATE_FMT).atStartOfDay(ZoneId.systemDefault()).toInstant(); - } else { - return LocalDateTime.parse(s, DATE_TIME_FMT).atZone(ZoneId.systemDefault()).toInstant(); - } - } } diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java deleted file mode 100644 index 10de36001..000000000 --- a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_ConverterTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.services.converters; - -import org.testng.Assert; -import org.testng.annotations.Test; - -public class S_DF08_ConverterTest { - @Test - public void testTestConvertStrToLong() { - S_DF08_Converter converter = new S_DF08_Converter(); - Assert.assertNull(converter.convertStrToLong(null)); - Assert.assertEquals(1L, converter.convertStrToLong("1")); - } - - @Test - public void testTestConvertStrToDate() { - S_DF08_Converter converter = new S_DF08_Converter(); - Assert.assertNull(converter.convertStrToDate(null)); - Assert.assertEquals("2022-12-29 00:00:00.0", converter.convertStrToDate("29.12.2022").toString()); - Assert.assertEquals("2023-01-13 15:32:01.0", converter.convertStrToDate("13.01.2023 15:32:01").toString()); - } -} \ No newline at end of file From 592b2cd02fb33784e7ec88f5a18ee3cf42364d11 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 13 Jan 2023 20:35:46 +0300 Subject: [PATCH 13/18] securities-service http://jira.mfd.msk:8088/browse/CLS-16 validation delete --- .../validation/ValidationProvider.java | 4 ++- .../rule/MmsDeleteValidationRule.java | 32 +++++++++++++++++++ .../rule/MmsUpdateValidationRule.java | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsDeleteValidationRule.java diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java index 1f6ca6675..481aec643 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java @@ -7,6 +7,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSe import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; import ru.spcex.clearing.securities.errors.SecuritiesError; import ru.spcex.clearing.securities.validation.rule.EndDtAfterStartDt; +import ru.spcex.clearing.securities.validation.rule.MmsDeleteValidationRule; import ru.spcex.clearing.securities.validation.rule.MmsNewValidationRule; import ru.spcex.clearing.securities.validation.rule.MmsUpdateValidationRule; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -59,7 +60,8 @@ public class ValidationProvider { context.setValidatedObject(mmsRequest); context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); return new ValidatorImpl<>(context, - new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true) + new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true), + MmsDeleteValidationRule.StatusIsActive ); }; } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsDeleteValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsDeleteValidationRule.java new file mode 100644 index 000000000..bbf126857 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsDeleteValidationRule.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public enum MmsDeleteValidationRule implements IValidationRule> { + StatusIsActive() { + @Override + public Optional validate(ImdgValidationContext context) { + MoneyMarketSecurity mms = context.getStoredObject(Stored.PresentById); + //проверка только если PresentById найдет объект и сохранит его + if (mms != null && !Status.Active.getKey().equals(mms.getWorkflowStatus())) { + return of(SecuritiesError.InstrumentNotActive); + } else { + return empty(); + } + } + }; + + @Override + public String ruleName() { + return "MmsDeleteValidationRule." + name(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java index 2bf92e6c4..1d88b45bb 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java @@ -27,6 +27,6 @@ public enum MmsUpdateValidationRule implements IValidationRule Date: Mon, 16 Jan 2023 10:52:36 +0300 Subject: [PATCH 14/18] =?UTF-8?q?balance-service=20=D0=BF=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D1=8B=20=D1=81=20null=20BigInt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/balance/validation/Sdf09ValidationRule.java | 4 ++++ .../clearing/balance/validation/Sdf16ValidationRule.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java index c707de1b4..325e00892 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf09ValidationRule.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.balance.validation; +import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; @@ -24,6 +25,9 @@ public enum Sdf09ValidationRule implements IValidationRule companySymbolImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + if (sdf09.getInn() == null) { + return of( BalanceError.CompanyNotFound, "empty inn"); + } String innStr = sdf09.getInn().setScale(0, RoundingMode.DOWN).toString(); CompanySymbols symbol = companySymbolImdg .getSingleObjectByFieldValues(Map.of("companySymbol", CompanySymbol.INN.getKey(), diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java index 679603699..b56e58f17 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java @@ -21,6 +21,12 @@ public enum Sdf16ValidationRule implements IValidationRule companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + if (sdf16.getInn() == null) { + return of(BalanceError.CompanyNotFound, "empty inn"); + } + if (sdf16.getBic() == null) { + return of(BalanceError.CompanyNotFound, "empty bic"); + } String innStr = sdf16.getInn().setScale(0, RoundingMode.DOWN).toString(); String bicStr = sdf16.getBic().setScale(0, RoundingMode.DOWN).toString(); CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectBySQL( From e22e4222141fa0d15d0aafe85bc538feab338223 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 16 Jan 2023 11:29:05 +0300 Subject: [PATCH 15/18] =?UTF-8?q?balance-service=20=D0=BF=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D1=8B=20=D1=81=20null=20BigInt.=202.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validation/Sdf16ValidationRule.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java index b56e58f17..ce0616a82 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java @@ -21,19 +21,23 @@ public enum Sdf16ValidationRule implements IValidationRule companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); - if (sdf16.getInn() == null) { - return of(BalanceError.CompanyNotFound, "empty inn"); + String sql = ""; + if (sdf16.getInn() != null) { + String innStr = sdf16.getInn().setScale(0, RoundingMode.DOWN).toString(); + sql = String.format("(companySymbolValue = '%s' and companySymbol = '%s') ", + innStr, CompanySymbol.INN.getKey()); } - if (sdf16.getBic() == null) { - return of(BalanceError.CompanyNotFound, "empty bic"); + if (sdf16.getBic() != null) { + if (!sql.isEmpty()) sql += " or "; + String bicStr = sdf16.getBic().setScale(0, RoundingMode.DOWN).toString(); + sql += String.format("(companySymbolValue = '%s' and companySymbol = '%s') ", + bicStr, CompanySymbol.BIC.getKey()); + } + if (sql.isEmpty()) { + return of(BalanceError.CompanyNotFound, "inn and bic is empty"); } - String innStr = sdf16.getInn().setScale(0, RoundingMode.DOWN).toString(); - String bicStr = sdf16.getBic().setScale(0, RoundingMode.DOWN).toString(); - CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectBySQL( - String.format("(companySymbolValue = '%s' and companySymbol = '%s') " + - "or (companySymbolValue = '%s' and companySymbol = '%s')", - innStr, CompanySymbol.INN.getKey(), bicStr, CompanySymbol.BIC.getKey())); Company company = null; + CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectBySQL(sql); if (companySymbols != null) { company = companyImdg.getSingleObjectByID(companySymbols.getCompanyId()); } From 394bcec2b38c8a25fdfc3937504b70653dfa2a7e Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 16 Jan 2023 12:19:47 +0300 Subject: [PATCH 16/18] =?UTF-8?q?scheduler-service=20=D0=BE=D1=82=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=20=D0=B2=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B0=D1=81=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/service/LauncherSender.java | 68 +++++++++++++++++++ .../scheduler/service/TaskManager.java | 11 ++- 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherSender.java diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherSender.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherSender.java new file mode 100644 index 000000000..bbf98c9d5 --- /dev/null +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherSender.java @@ -0,0 +1,68 @@ +package ru.spcex.clearing.scheduler.service; + + +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportWithPeriodRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +@Service +public class LauncherSender { + Logger log = LoggerFactory.getLogger(getClass()); + private final Producer kafka; + private final ImdgId idGenerator; + + @Autowired + public LauncherSender(Producer kafka, ImdgProvider imdgProvider) { + this.kafka = kafka; + this.idGenerator = imdgProvider.getImdgIdGenerator(); + } + + protected BaseRequest makeCmdRequest(Task byTask, Long userId) { + Object toRequest; + if (Task.createReport_GREP.equals(byTask)) { // см. ru.spcex.clearing.backendapi.controller.request.cud.schedule.LauncherNew#toRequest + ReportWithPeriodRequest reportCommand = new ReportWithPeriodRequest(); + reportCommand.setReportId(byTask.getKey()); + toRequest = reportCommand; + } else { + LauncherCommandRequest taskRunnerCommandRequest = new LauncherCommandRequest(); + taskRunnerCommandRequest.setTaskName(byTask.getKey()); + taskRunnerCommandRequest.setUserId(userId); + toRequest = taskRunnerCommandRequest; + } + BaseRequest request = new BaseRequest<>(); + request.setId(idGenerator.nextId()); + request.setActionType(ActionType.NEW); + request.setRequestPayload(toRequest);// iAction.toRequest() + return request; + } + + public void sendCommandToQueue(Task toTaskQueue, Long userId) { + BaseRequest request = makeCmdRequest(toTaskQueue, userId); + String destination = toTaskQueue.topic(); // "launcher-" + getKey() + log.debug("Send command {} to {}", toTaskQueue, destination); + Future send = kafka.send(new ProducerRecord<>(destination, request)); + try { + send.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("Command " + toTaskQueue + " not send", e); + } catch (ExecutionException e) { + throw new RuntimeException("Command " + toTaskQueue + " not send", e); + } + } + +} diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/TaskManager.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/TaskManager.java index ee5b53975..b0a8708d5 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/TaskManager.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/TaskManager.java @@ -48,12 +48,15 @@ public class TaskManager implements EntryAddedListener, private Imdg launcherMap; private Imdg plannerAllTodayMap; private ConcurrentHashMap scheduledJobs; + private LauncherSender launcherSender; @Autowired TaskManager(TaskScheduler taskScheduler, - ImdgProvider imdgProvider) { + ImdgProvider imdgProvider, + LauncherSender launcherSender) { this.taskScheduler = taskScheduler; this.imdgProvider = imdgProvider; + this.launcherSender = launcherSender; } private static LocalDateTime dateOldTypeConvert(@NonNull Date oldDate) { @@ -216,8 +219,10 @@ public class TaskManager implements EntryAddedListener, // --- Реализация выполнения задач --- protected void doJob(PlannerAllToday task) { - if (getEnumByKey(Task.class, task.getTask()) != null) { + Task taskE = getEnumByKey(Task.class, task.getTask()); + if (taskE != null) { log.debug("LauncherCommandRequest received"); + // 1. cохранить команду Instant created = Instant.now(); Launcher launcher = new Launcher(); launcher.setTask(task.getTask()); @@ -225,6 +230,8 @@ public class TaskManager implements EntryAddedListener, launcher.setCreated(created); launcher.setUpdated(created); launcherMap.insert(launcher); + // 2. отправить сообщение + launcherSender.sendCommandToQueue(taskE, task.getParentId()); log.debug("successfully processed, new id {}", launcher.getId()); } } From c4e6cb142d9b4843635b937507977f1b26a3413c Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 16 Jan 2023 14:04:46 +0300 Subject: [PATCH 17/18] =?UTF-8?q?balance-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-74=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20sdf09/?= =?UTF-8?q?10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/spcex/clearing/balance/service/Sdf09Executor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf09Executor.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf09Executor.java index 96e8608bc..2291363ad 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf09Executor.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf09Executor.java @@ -137,6 +137,9 @@ public class Sdf09Executor extends AbstractExecutor { statement.setInOutDirection(InOutDirection.in.getKey()); statement.setAmount(sdf09.getSum()); statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); + statement.setInSDfId(sdf09.getId()); +// statement.setOutSDfId(sdf10.getId()); заполняется внешним кодом + statement.setInOutSDfType(InOutSDfType.type9.getKey()); statementImdg.update(statement); } From a0d6bc202556fc93698af21932618a93f6a4c730 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 16 Jan 2023 14:51:44 +0300 Subject: [PATCH 18/18] =?UTF-8?q?balance-service=20Sdf16ValidationRule=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8,=20=D1=82=D0=BA.=20=D0=BF=D0=BE=20bic=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B8=D1=89=D0=B5=D1=82,=20=D0=BD=D0=BE=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BD=D1=8F=D0=BB=20=D0=BF=D0=BE=D1=87=D0=B5=D0=BC?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validation/Sdf16ValidationRule.java | 5 +++ .../validation/Sdf16ValidationRuleTest.java | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 clearing-parent/balance-service/src/test/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRuleTest.java diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java index ce0616a82..fac3d544b 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf16ValidationRule.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.balance.validation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.sdf.SDf16; @@ -33,11 +35,14 @@ public enum Sdf16ValidationRule implements IValidationRule ctx = new ImdgValidationContext<>(); + SDf16 object = new SDf16(); +// object.setBic(BigDecimal.valueOf(1000004L)); + object.setInn(BigDecimal.valueOf(1000024L)); + ctx.setValidatedObject(object); + ctx.addImdg(IMDGDistributedNames.Map_CompanySymbols, makeTestMap()); + ctx.addImdg(IMDGDistributedNames.Map_Company, makeTestMap()); + Optional err = Sdf16ValidationRule.CompanyPresent.validate(ctx); + assertTrue(err.isPresent()); + } + + Imdg makeTestMap() { + return new Imdg() { + @Override + public String getMapName() { + return Imdg.super.getMapName(); + } + + @Override + public T getSingleObjectBySQL(String sql) { + return null; + } + }; + } +} \ No newline at end of file