Classification: сервис классификации объектов сущностей
Сервис позволяет классифицировать объекты различных сущностей по полям этих объектов.
Команды могут приходить как по HTTP, так и через Kafka в топик classification_commands.
В сервисе реализованы следующие команды:
- Получение иерархии классов
- Получение ветви иерархии классов до определенного узла
- Статистика количества классов у сущности
- Получение класса
- Получение списка классов
- Классификация типа
- Список полей объекта для классифицированного типа
- Создание нового класса
- Редактирование класса
- Удаление класса
- Обновления атрибутов EntityObject с учетом классификации
- Классы категоризированные по правилу генерации атрибутов
- Обновление правил генерации в классах
- Добавление массива кодов полей в классы
- Удаление массива кодов полей в классы
Optimistic Lock
У нескольких команд реализован механизм оптимистичных блокировок. Для этого в данных присутствует поле version.
Задача оптимистичных блокировок - предотвратить одновременное редактирование объекта из двух открытых форм.
Сначала фронтэнд запрашивает данные объекта и получает в ответе версию данных - поле version.
Он прикладывает эту версию в ответе. Если на бэкэнде она совпадает с исходной (не было других модификаций),
тогда данные сохраняются, а версия поднимается. Иначе сохранения не происходит, данные не перетираются.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.utils, в котором содержатся разные хелперы.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Конфигурирование Classification
Требования к запуску Classification
Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm.
Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul. Для настройки подключения к ним нужно заполнить обязательные переменные окружения из раздела ниже.
Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus, ApiGateway. В этом случае нужно уделить внимание настройкам, связанным с ServiceDiscovery и CommandDiscovery.
Запуск Classification из консоли с помощью SBT
CLASSIFICATION_DB_HOST=localhost CLASSIFICATION_DB_PORT=5432 CLASSIFICATION_DB_NAME=classification_db CLASSIFICATION_DB_USER=postgres CLASSIFICATION_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения Classification
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| CLASSIFICATION_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| CLASSIFICATION_HTTP_PORT | int | нет | 8192 | Порт, на котором слушает HTTP-сервер |
| CLASSIFICATION_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| CLASSIFICATION_KAFKA_TOPIC | string | нет | "classification_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| CLASSIFICATION_KAFKA_CONSUMER_GROUP | string | нет | "classification_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| CLASSIFICATION_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| CLASSIFICATION_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| CLASSIFICATION_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| CLASSIFICATION_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| CLASSIFICATION_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах CLASSIFICATION_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| CLASSIFICATION_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который CLASSIFICATION_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| CLASSIFICATION_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| CLASSIFICATION_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| CLASSIFICATION_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| CLASSIFICATION_KAFKA_AUTH_PRINCIPAL | string | нет | "" | Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos). |
| CLASSIFICATION_KAFKA_AUTH_KEYTAB_PATH | string | нет | "" | Путь до keytab-файла(в случае соединения с kafka через Kerberos). |
| CLASSIFICATION_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применяться не будет. |
| CLASSIFICATION_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| CLASSIFICATION_KAFKA_AUTH_MODE | string | нет | "static" | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| CLASSIFICATION_KAFKA_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings. |
| CLASSIFICATION_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| CLASSIFICATION_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| CLASSIFICATION_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| CLASSIFICATION_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| CLASSIFICATION_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| CLASSIFICATION_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| CLASSIFICATION_DISCOVERABLE_ID | string | нет | "another_CLASSIFICATION_service_instance" | ID сервиса в ServiceDiscovery |
| CLASSIFICATION_DISCOVERABLE_NAME | string | нет | "classification" | Имя сервиса в ServiceDiscovery |
| CLASSIFICATION_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| CLASSIFICATION_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| CLASSIFICATION_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| CLASSIFICATION_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| CLASSIFICATION_SERVICE_TITLE | string | нет | "Classification" | Название сервиса для отображения |
| CLASSIFICATION_SERVICE_DESCRIPTION | string | нет | "Сервис аналитики" | Описание сервиса для отображения |
| CLASSIFICATION_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| CLASSIFICATION_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| CLASSIFICATION_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| CLASSIFICATION_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| CLASSIFICATION_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| CLASSIFICATION_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| CLASSIFICATION_DB_HOST | string | да | Хост БД | |
| CLASSIFICATION_DB_PORT | int | да | Порт БД | |
| CLASSIFICATION_DB_NAME | string | да | Имя базы в БД | |
| CLASSIFICATION_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| CLASSIFICATION_DB_USER | string | да | Пользователь БД | |
| CLASSIFICATION_DB_PASSWORD | string | да | Пароль пользователя БД | |
| CLASSIFICATION_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| CLASSIFICATION_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| CLASSIFICATION_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| CLASSIFICATION_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| CLASSIFICATION_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| CLASSIFICATION_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| CLASSIFICATION_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| CLASSIFICATION_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| CLASSIFICATION_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| CLASSIFICATION_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| CLASSIFICATION_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| CLASSIFICATION_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| CLASSIFICATION_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| CLASSIFICATION_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| CLASSIFICATION_FS_URI | string | да | http://localhost:9000/ | Адрес файлового хранилища |
| CLASSIFICATION_FS_ACCESS_KEY_ID | string | да | minioadmin | Имя пользователя файлового хранилища |
| CLASSIFICATION_FS_SECRET_ACCESS_KEY | string | да | minioadmin | Пароль пользователя файлового хранилища |
| CLASSIFICATION_FS_UPLOAD_PARALLELISM | int | нет | 4 | Параллелизм для загрузки файлов |
| CLASSIFICATION_FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| CLASSIFICATION_FS_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep |
| CLASSIFICATION_FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). |
| CLASSIFICATION_FS_CACHE_TTL | duration string | нет | Время жизни клиента в кеше | |
| CLASSIFICATION_EXTERNAL_MIGRATIONS_RETRY_DELAY | duration string | нет | 15 seconds | Задержка между повторными попытками запуска внешних миграций |
| CLASSIFICATION_EXTERNAL_MIGRATIONS_RETRY_ATTEMPTS | int | нет | 5 | Максимальное количество попыток запуска внешних миграций |
| CLASSIFICATION_DM_SCHEMA_CACHE_SIZE | int | нет | 128 | Максимальный размер кэша для json schema |
| CLASSIFICATION_DM_SCHEMA_CACHE_TTL | duration string | нет | 5 minute | Время жизни элементов в кэше для json schema |
| CLASSIFICATION_LAMP_FILE_CACHE_SIZE | int | нет | 64 | Максимальный размер кэша для файлов из lamp |
| CLASSIFICATION_LAMP_FILE_CACHE_TTL | duration string | нет | 30 minute | Время жизни элементов в кэше для файлов из lamp |
| CLASSIFICATION_FTS_MAPPING_CACHE_SIZE | int | нет | 64 | Максимальный размер кэша для маппингов в полнотекстовом поиске |
| CLASSIFICATION_FTS_MAPPING_CACHE_TTL | duration string | нет | 5 minute | Время жизни элементов в кэше для маппингов в полнотекстовом поиске |
| CLASSIFICATION_DM_OBJECT_PAGE_SIZE | int | нет | 100 | Размер страницы при выборке объектов из data-model |
| CLASSIFICATION_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS | int | нет | 5 | Поле attempts из RetrySettings |
| CLASSIFICATION_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY | duration string | нет | "5 seconds" | Поле delay из RetrySettings |
| CLASSIFICATION_SENDERLIB_COMMANDS_HTTP_RETRY_KIND | string | нет | "OnSomeExceptions(ConnectException)" | CommandResultRetryConditionKind |
| CLASSIFICATION_JOURNAL_MODE | string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
| CLASSIFICATION_JOURNAL_TOPIC | string | да, если переменная CLASSIFICATION_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
Список команд сервиса Classification
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions |
|---|---|---|
| classification_ListEntityClassHierarchy | EntityClass | ListEntityClassHierarchy |
| classification_ListEntityClassParents | EntityClass | GetEntityClass |
| classification_EntityTypeClassCount | EntityClass | EntityTypeClassCount |
| classification_GetEntityClass | EntityClass | GetEntityClass |
| classification_ClassifyObject | EntityClass | ClassifyObject |
| classification_CalculateManagedFields | EntityClass | CalculateManagedFields |
| classification_CreateEntityClass | EntityClass | CreateEntityClass |
| classification_UpdateEntityClass | EntityClass | UpdateEntityClass |
| classification_DeleteEntityClass | EntityClass | DeleteEntityClass |
| classification_updateObjectWithReclassification | Произвольный EntityType из ObjectStorage | DataModel_UpdateObject |
| classification_EntityClassesByValueGenerationRules | EntityClass | ClassifyObject |
| classification_UpdateValueGenerationRuleEntityClasses | EntityClass | UpdateEntityClass |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
ListEntityClassHierarchy (classification)
Payload для команды
"Tag"
Результат выполнения команды
[
{
"entityClass": {
"id": "0becc650-2909-4769-869d-2521c3e452e1",
"parentId": null,
"entityType": "Tag",
"title": "Арматура",
"controlFieldCode": "tagType",
"controlFieldValue": "763a967d-625f-44be-ad7c-d8ccd9e3af19",
"managedFields": [
{
"fieldCode": "istochnik_dannyх",
"isMandatory": false
},
{
"fieldCode": "klapan",
"isMandatory": true
},
{
"fieldCode": "diametr",
"isMandatory": false
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1719594386281,
"createdBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"modified": 1722498718415,
"modifiedBy": "00000000-0000-0000-0000-000000000000",
"version": 9
},
"subclasses": []
}
]
Возвращает дерево сущностей классов
- На входе: EntityTypeId (String)
- На выходе: EntityClassHierarchyDTO[]
| Команда | Путь |
|---|---|
| classification_ListEntityClassHierarchy | HTTP POST "v1/entityClass/listHierarchy" |
ListEntityClassParents (classification)
Payload для команды
{
"entityType": "mechanism",
"entityId": "23792ab1-0f47-4dd6-b186-9502931c67fb"
}
Результат выполнения команды
[
{
"id": "dd82aa1e-24a7-4d90-b49a-b53dbeb3f4ec",
"parentId": null,
"entityType": "mechanism",
"title": "Очень длинное наименование класса Очень длинное наименование класса Очень длинное наименование класса",
"controlFieldCode": "mechanism_catalog",
"controlFieldValue": "cdb6eb0f-7316-4f45-863b-74b08e70e759",
"managedFields": [
{
"fieldCode": "optional_field",
"isMandatory": true
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718887945200,
"createdBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"modified": 1719380902380,
"modifiedBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"version": 6
}
]
Возвращает всех родителей сущности класса, в порядке от ближайшего до самого дальнего
- На входе: ListEntityClassParentsDTO
- На выходе: EntityClass[]
| Команда | Путь |
|---|---|
| classification_ListEntityClassParents | HTTP POST "v1/entityClass/listEntityClassParents" |
EntityTypeClassCount (classification)
Payload для команды
[
"Tag",
"Document",
"AnotherEntity"
]
Результат выполнения команды
{
"Tag": 110,
"Document": 6,
"AnotherEntity": 25
}
Считает количество классов с указанными сущностями
| Команда | Путь |
|---|---|
| classification_EntityTypeClassCount | HTTP POST "v1/entityClass/entityTypeClassCount" |
GetEntityClass (classification)
Payload для команды
"23792ab1-0f47-4dd6-b186-9502931c67fb"
Результат выполнения команды
{
"id": "23792ab1-0f47-4dd6-b186-9502931c67fb",
"parentId": "dd82aa1e-24a7-4d90-b49a-b53dbeb3f4ec",
"entityType": "mechanism",
"title": "Заводной механизм",
"controlFieldCode": "mechanism_catalog",
"controlFieldValue": "adf7af2f-e5e3-4a08-bf1c-4ea792358bab",
"managedFields": [],
"valueGenerationRuleIds": [],
"created": 1719379649875,
"createdBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"modified": 1719379649875,
"modifiedBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"version": 1
}
Получить сущность класса по её идентификатору
- На входе: EntityClassId (UUID)
- На выходе: EntityClass
| Команда | Путь |
|---|---|
| classification_GetEntityClass | HTTP POST "v1/entityClass/getEntityClass" |
ListEntityClasses (classification)
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "23792ab1-0f47-4dd6-b186-9502931c67fb",
"parentId": "dd82aa1e-24a7-4d90-b49a-b53dbeb3f4ec",
"entityType": "mechanism",
"title": "Заводной механизм",
"controlFieldCode": "mechanism_catalog",
"controlFieldValue": "adf7af2f-e5e3-4a08-bf1c-4ea792358bab",
"managedFields": [],
"valueGenerationRuleIds": [],
"created": 1719379649875,
"createdBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"modified": 1719379649875,
"modifiedBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"version": 1
}
],
"total": 1
}
Получить список сущностей класса
- На входе: Search
- На выходе: Page[EntityClass]
| Команда | Путь |
|---|---|
| classification_ListEntityClasses | HTTP POST "v1/entityClass/list" |
ClassifyObject (classification)
Payload для команды
{
"entityType": "Tag",
"attributes": {
"complex": "5f80e530-1ccc-41e3-a088-03d719ba3f23",
"<другие поля производные от объектов иерархии>": "...",
"tagType": "763a967d-625f-44be-ad7c-d8ccd9e3af19"
}
}
Результат выполнения команды
[
{
"entityClass": {
"id": "d6bfc896-2dcb-45ca-94be-1654f10ae79d",
"parentId": null,
"entityType": "Tag",
"title": "Арматура 30мм",
"controlFieldCode": "parentTag",
"controlFieldValue": "5639bae9-e313-44b4-a3b7-8fd06c8ef7ad",
"managedFields": [
{
"fieldCode": "code",
"isMandatory": true
},
{
"fieldCode": "diametr",
"isMandatory": true
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718885396389,
"createdBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"modified": 1718885396389,
"modifiedBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"version": 1
},
"subclasses": [
{
"entityClass": {
"id": "e5bfc896-2dcb-45ca-94be-1654f10ae431",
"parentId": "d6bfc896-2dcb-45ca-94be-1654f10ae79d",
"<другие поля EntityClass модели>": "..."
}
}
]
}
]
Классификация типа сущности.
- На входе: ClassifyObjectDto
- На выходе: EntityClassHierarchyDTO[]
| Команда | Путь |
|---|---|
| classification_ClassifyObject | HTTP POST "v1/entityClass/classifyObject" |
CalculateManagedFields (classification)
Payload для команды
{
"entityType": "Tag",
"attributes": {
"complex": "5f80e530-1ccc-41e3-a088-03d719ba3f23",
"<другие поля производные от объектов иерархии>": "...",
"tagType": "763a967d-625f-44be-ad7c-d8ccd9e3af19"
}
}
Результат выполнения команды
[
{
"fieldCode": "code",
"isMandatory": true
},
{
"fieldCode": "diametr",
"isMandatory": true
}
]
Получить список полей объекта для классифицированного типа.
- На входе: ClassifyObjectDto
- На выходе: ManagedField[]
| Команда | Путь |
|---|---|
| classification_CalculateManagedFields | HTTP POST "v1/entityClass/calculateManagedFields" |
CreateEntityClass (classification)
Payload для команды
{
"parentId": null,
"entityType": "Tag",
"title": "Арматура 30мм",
"controlFieldCode": "parentTag",
"controlFieldValue": "5639bae9-e313-44b4-a3b7-8fd06c8ef7ad",
"managedFields": [
{
"fieldCode": "code",
"isMandatory": true
},
{
"fieldCode": "diametr",
"isMandatory": true
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
]
}
Результат выполнения команды
"00001111-2222-3333-4444-555566667777"
Добавление нового класса сущности.
- На входе: CreateEntityClassDTO
- На выходе: ID нового класса (UUID)
| Команда | Путь |
|---|---|
| classification_CreateEntityClass | Kafka Topic "classification_commands" |
UpdateEntityClass (classification)
Результат выполнения команды
{
"id": "d6bfc896-2dcb-45ca-94be-1654f10ae79d",
"title": "Арматура 30мм",
"controlFieldCode": "parentTag",
"controlFieldValue": "5639bae9-e313-44b4-a3b7-8fd06c8ef7ad",
"managedFields": [
{
"fieldCode": "code",
"isMandatory": true
},
{
"fieldCode": "diametr",
"isMandatory": true
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"version": 1
}
Результат выполнения команды
true
Обновление класса сущности.
- На входе: UpdateEntityClassDTO
- На выходе: Boolean
| Команда | Путь |
|---|---|
| classification_UpdateEntityClass | Kafka Topic "classification_commands" |
DeleteEntityClass (classification)
Payload для команды
"00001111-2222-3333-4444-555566667777"
Результат выполнения команды
true
Удаление класса сущности.
- На входе: ID класса сущности (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| classification_DeleteEntityClass | Kafka Topic "classification_commands" |
updateObjectWithReclassification
Payload для команды
{
"entityType": "Order",
"objectId": "18b1011b-9db3-4186-a53c-971016030068",
"version": 2,
"attributes": {
"date": 1577869200,
"number": 514
}
}
Результат выполнения команды
true
Или ошибка, если объект не существует
{
"businessError": null,
"message": "ERROR: Entity object not found",
"stackTrace": null,
"data": null
}
Или ошибка, если объект был обновлен из другого места
{
"businessError": null,
"message": "ERROR: object version is not actual (Optimistic Lock)",
"stackTrace": null,
"data": null
}
Изменение объекта сущности. Использует оптимистичную блокировку. Если изменяемый объект
был изменен параллельно (например, из другой формы другим пользователем),
тогда вернется ошибка ERROR: object version is not actual (Optimistic Lock), показывающая,
что не произошло обновления из-за некорректной версии.
Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.
- На входе: UpdateEntityObject
- На выходе: boolean, true - обновление успешно, false - неуспешно.
| Команда | Путь |
|---|---|
| classification_updateObjectWithReclassification | Kafka Topic "classification_commands" |
EntityClassesByValueGenerationRules
Payload для команды
{
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
]
}
Результат выполнения команды
[
{
"valueGenerationRuleId": "5f80e530-1ccc-41e3-a088-03d719ba3f23",
"entityClasses": [
{
"id": "e718335f-8ea9-45c3-ab66-164965e2bbb9",
"parentId": null,
"entityType": "testEntity3",
"title": "Новый тестовый 123",
"controlFieldCode": "testEntity",
"controlFieldValue": "9af6310c-dbf4-4907-9cda-8f8657e98d8d",
"managedFields": [],
"valueGenerationRuleIds": [
"4f80e530-1ccc-41e3-a088-03d719ba3f23",
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718799645926,
"createdBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"modified": 1718799645926,
"modifiedBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"version": 1
},
{
"id": "814f6890-e030-4b3e-a652-5e2986466aab",
"parentId": null,
"entityType": "construction",
"title": "Деревянные конструкции",
"controlFieldCode": "construction_type",
"controlFieldValue": "eb299170-0f60-42e6-8756-ee793b885e69",
"managedFields": [
{
"fieldCode": "construction_foreign",
"isMandatory": true
},
{
"fieldCode": "construction_type",
"isMandatory": false
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718716494252,
"createdBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"modified": 1718716494252,
"modifiedBy": "a21002d0-bd59-4b4d-8b6f-6707a2e1cc21",
"version": 1
}
]
}
]
Получить список классов содержащих переданные идентификаторы правила, и сгруппированные по ним. Классы могут дублироваться в категориях
Поддерживается только синхронный вызов. Результат выполнения команды не журналируется.
- На входе: EntityClassesByValueGenerationRulesInput
- На выходе: EntityClassesByValueGenerationRulesOutput
| Команда | Путь |
|---|---|
| classification_EntityClassesByValueGenerationRules | Kafka Topic "classification_commands" |
UpdateValueGenerationRuleEntityClasses
Payload для команды
{
"valueGenerationRuleId": "5f80e530-1ccc-41e3-a088-03d719ba3f23",
"entityClassIds": [
"41bc3c4c-44fa-43cc-8e07-3d2207cf033c"
],
"clearOtherClasses": true
}
Результат выполнения команды
[
{
"id": "41bc3c4c-44fa-43cc-8e07-3d2207cf033c",
"parentId": null,
"entityType": "testEntity3",
"title": "подкласс",
"controlFieldCode": "testEntity",
"controlFieldValue": "be231b97-6d37-4821-b78b-4c2ce8c1dea0",
"managedFields": [],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23",
"3f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718804181037,
"createdBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"modified": 1718804181037,
"modifiedBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"version": 2
}
]
Добавить новое правило генерации значений к классам. С возможностью исключения правила из классов, идентификаторы которых не указаны
Поддерживается асинхронный и синхронный вызов. Результат выполнения команды не журналируется.
- На входе: UpdateValueGenerationRuleEntityClassesInput
- На выходе: EntityClass[]
| Команда | Путь |
|---|---|
| classification_UpdateValueGenerationRuleEntityClasses | Kafka Topic "classification_commands" |
AddManagedFieldsEntityClasses
Payload для команды
{
"managedFields": [
{
"fieldCode": "construction_foreign",
"isMandatory": true
},
{
"fieldCode": "construction_type",
"isMandatory": false
}
],
"entityClassIds": [
"41bc3c4c-44fa-43cc-8e07-3d2207cf033c"
]
}
Результат выполнения команды
[
{
"id": "41bc3c4c-44fa-43cc-8e07-3d2207cf033c",
"parentId": null,
"entityType": "testEntity3",
"title": "подкласс",
"controlFieldCode": "testEntity",
"controlFieldValue": "be231b97-6d37-4821-b78b-4c2ce8c1dea0",
"managedFields": [
{
"fieldCode": "construction_foreign",
"isMandatory": true
},
{
"fieldCode": "construction_type",
"isMandatory": false
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23",
"3f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718804181037,
"createdBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"modified": 1718804181037,
"modifiedBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"version": 3
}
]
При обработке команды обходятся все EntityClass uuid которых указаны в entityClassIds. У них уже могут быть проставленные managedFields. Новые managedFields добавляем в конец списка каждого класса, НО так же добавляем проверку - если какое то из полей входного DTO уже есть в списке, то его позиция не должна измениться, дубликат поля в конце списка не должен появиться, isMandatory этого поля должен обновиться согласно входному DTO.
Поддерживается асинхронный и синхронный вызов. Результат выполнения команды не журналируется.
- На входе: AddManagedFieldsEntityClassesDto
- На выходе: EntityClass[]
| Команда | Путь |
|---|---|
| classification_AddManagedFieldsEntityClasses | Kafka Topic "classification_commands" |
RemoveManagedFieldsEntityClasses
Payload для команды
{
"managedFields": [
"construction_foreign"
],
"entityClassIds": [
"41bc3c4c-44fa-43cc-8e07-3d2207cf033c"
]
}
Результат выполнения команды
[
{
"id": "41bc3c4c-44fa-43cc-8e07-3d2207cf033c",
"parentId": null,
"entityType": "testEntity3",
"title": "подкласс",
"controlFieldCode": "testEntity",
"controlFieldValue": "be231b97-6d37-4821-b78b-4c2ce8c1dea0",
"managedFields": [
{
"fieldCode": "construction_type",
"isMandatory": false
}
],
"valueGenerationRuleIds": [
"5f80e530-1ccc-41e3-a088-03d719ba3f23",
"3f80e530-1ccc-41e3-a088-03d719ba3f23"
],
"created": 1718804181037,
"createdBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"modified": 1718804181037,
"modifiedBy": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357",
"version": 4
}
]
Обрабатываются все EntityClass, uuid которых указаны в entityClassIds. Удаляются из списка их managedFields поля с кодами из DTO. Остальные поля не должны поменять свой порядок по отношению друг к другу.
- На входе: RemoveManagedFieldsEntityClassesDto
- На выходе: EntityClass[]
| Команда | Путь |
|---|---|
| classification_RemoveManagedFieldsEntityClasses | Kafka Topic "classification_commands" |
Объекты сервиса classification
ClassifyObjectDto
Входные данные классификации
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | String | да | Код типа |
| attributes | JSON Object | да | Атрибуты объекта, поля указывающее на связи с родителями и их идентификаторы (строка:строка или строка:массив) |
ListEntityClassParentsDTO
Входные данные классификации
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | EntityTypeId (String) | да | Код типа |
| entityId | EntityClassId (UUID) | да | Json c атрибутами объекта, поля указывающее на связи с родителями и их идентификаторы (строка:строка или строка:массив) |
EntityClassHierarchyDTO
Дерево сущностей класса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityClass | EntityClass | да | Сущность класса |
| subclasses | EntityClassHierarchyDTO[] | да | Дочерние сущности класса |
EntityClass
Сущность класса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | EntityClassId (UUID) | да | Идентификатор сущности класса |
| entityType | EntityTypeId (String) | да | Код типа |
| parentId | EntityClassId (UUID) | нет | Идентификатор родительской сущности класса |
| title | String | да | Наименование сущности класса |
| controlFieldCode | String | да | Название поля указывающее на принадлежность родителю согласно системы справочников |
| controlFieldValue | JSON String / JSON Array | да | Внешний/-ие идентификатор/-ы родителя из системы справочников |
| managedFields | ManagedField[] | да | Отображаемые поля для этой сущности класса |
| valueGenerationRuleIds | UUID[] | да | Идентификаторы правил генерации значения |
| context | String | нет | Код проекта к которому относится объект |
| created | TimeStamp | да | Дата создания |
| createdBy | UUID | да | Идентификатор пользователя который создал сущность |
| modified | TimeStamp | да | Дата изменения |
| modifiedBy | UUID | да | Идентификатор пользователя который изменил сущность |
| version | Int | да | Версия (optimistic lock) |
CreateEntityClassDTO
Объект создания сущности класса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | EntityTypeId (String) | да | Код типа |
| parentId | EntityClassId (UUID) | нет | Идентификатор родительской сущности класса |
| title | String | да | Наименование сущности класса |
| controlFieldCode | String | да | Название поля указывающее на принадлежность родителю согласно системы справочников |
| controlFieldValue | JSON String / JSON Array | да | Внешний/-ие идентификатор/-ы родителя из системы справочников |
| managedFields | ManagedField[] | да | Отображаемые поля для этой сущности класса |
| valueGenerationRuleIds | UUID[] | да | Идентификаторы правил генерации значения |
UpdateEntityClassDTO
Объект обновления сущности класса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | EntityClassId (UUID) | да | Идентификатор сущности класса |
| title | String | да | Наименование сущности класса |
| controlFieldCode | String | да | Название поля указывающее на принадлежность родителю согласно системы справочников |
| controlFieldValue | JSON String / JSON Array | да | Внешний/-ие идентификатор/-ы родителя из системы справочников |
| managedFields | ManagedField[] | да | Отображаемые поля для этой сущности класса |
| valueGenerationRuleIds | UUID[] | да | Идентификаторы правил генерации значения |
| version | Int | да | Версия (optimistic lock) |
ManagedField
Управляемое поле
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fieldCode | String | да | Название поля |
| isMandatory | Boolean | да | Является ли обязательным |
UpdateEntityObject
Изменение объекта сущности
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | EntityTypeId (String) | да | Строковый код типа сущности |
| objectId | UUID | да | ID объекта |
| version | Int | да | Версия объекта. Нужна для оптимистичных блокировок |
| attributes | JSON Object | да | Json с полями объекта. Должен содержать все поля объекта. |
EntityClassesByValueGenerationRulesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| valueGenerationRuleIds | UUID[] | да | Идентификаторы правил генерации значения |
EntityClassesByValueGenerationRulesOutput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| valueGenerationRuleId | UUID | да | Идентификатор правила генерации значения |
| entityClasses | EntityClass[] | да | Сущности класса содержащие это правило |
UpdateValueGenerationRuleEntityClassesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| valueGenerationRuleId | UUID | да | Идентификатор правила генерации значения |
| entityClassIds | EntityClassId[] | да | Идентификаторы классов для обновления |
| clearOtherClasses | Boolean | нет | Очищать ли текущие правила генерации значения, у классов не вошедших в выборку |
AddManagedFieldsEntityClassesDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| managedFields | ManagedField[] | да | Отображаемые поля для этой сущности класса |
| entityClassIds | EntityClassId[] | да | Идентификаторы классов для обновления |
RemoveManagedFieldsEntityClassesDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| managedFields | String[] | да | Поля для этой сущности класса, которые хотим удалить |
| entityClassIds | EntityClassId[] | да | Идентификаторы классов для обновления |
Exporter: сервис для экспорта данных
Сервис принимает команды для работы с игроками и командами. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик exporter_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/exporter_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- EXPORTER_DB_HOST
- EXPORTER_DB_PORT
- EXPORTER_DB_NAME
- EXPORTER_DB_USER
- EXPORTER_DB_PASSWORD
Запуск из консоли с помощью SBT
EXPORTER_DB_HOST=localhost EXPORTER_DB_PORT=5432 EXPORTER_DB_NAME=exporter_db EXPORTER_DB_USER=postgres EXPORTER_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса Exporter
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
EXPORTER_HTTP_HOST |
string | нет | 0.0.0.0 |
Хост, на котором слушает HTTP-сервер |
EXPORTER_HTTP_PORT |
int | нет | 8192 |
Порт, на котором слушает HTTP-сервер |
EXPORTER_KAFKA_SERVERS |
string | да | localhost:9092 |
Адрес Kafka |
EXPORTER_KAFKA_TOPIC |
string | нет | exporter_commands |
Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
EXPORTER_KAFKA_CONSUMER_GROUP |
string | нет | exporter_consumer_group |
Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
EXPORTER_KAFKA_PARTITIONS |
int | нет | 10 |
Число читаемых партиций из кафка-топика команд. |
EXPORTER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF |
duration string | нет | 1 second |
Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
EXPORTER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF |
duration string | нет | 30 seconds |
Максимальное задержка до рестарта консьюмера после падения |
EXPORTER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR |
double | нет | 0.2 |
Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS |
int | нет | 5 |
Максимальное число рестартов консьюмера после падения (в пределах EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN |
duration string | нет | 5 minutes |
Временной отрезок, в который EXPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
EXPORTER_KAFKA_COMMANDEVENT_TOPIC |
string | да | commandevents |
Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
EXPORTER_KAFKA_AUTH_USER |
string | нет | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. | |
EXPORTER_KAFKA_AUTH_PASSWORD |
string | нет | Пароль учетной записи Kafka. | |
EXPORTER_KAFKA_AUTH_TRUSTSTORE_LOCATION |
string | нет | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. | |
EXPORTER_KAFKA_AUTH_TRUSTSTORE_PASSWORD |
string | нет | Пароль к харнилищу сертификатов. | |
EXPORTER_CONSUL_ADDR |
url string | нет | http://localhost:8500 |
Адрес Сonsul. |
EXPORTER_CONSUL_AUTH_USER |
string | нет | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. | |
EXPORTER_CONSUL_AUTH_PASSWORD |
string | нет | Пароль учетной записи Сonsul. | |
EXPORTER_TRACE_DURATION |
boolean | нет | false |
Признак необходимости трассировки выполнения команд |
EXPORTER_DISCOVERABLE_ID |
string | нет | another_EXPORTER_service_instance |
ID сервиса в ServiceDiscovery |
EXPORTER_DISCOVERABLE_NAME |
string | нет | exporter |
Имя сервиса в ServiceDiscovery |
EXPORTER_DISCOVERABLE_HOST |
string | да | localhost |
Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
EXPORTER_DISCOVERABLE_PORT |
int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
EXPORTER_DISCOVERABLE_LIVETIME |
duration string | нет | 2 minutes |
Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
EXPORTER_DISCOVERABLE_HEALTHPASS |
string | нет | 1 minute |
Периодичность отправки health check в ServiceDiscovery |
EXPORTER_SERVICE_TITLE |
string | нет | Exporter |
Название сервиса для отображения |
EXPORTER_SERVICE_DESCRIPTION |
string | нет | Service EXPORTER |
Описание сервиса для отображения |
EXPORTER_AKKA_HTTP_CLIENT_MAXCON |
int | нет | 512 |
Максимальное число одновременных исходящих HTTP-соединений |
EXPORTER_AKKA_HTTP_CLIENT_MAXREQ |
int | нет | 1024 |
Максимальное число одновременных исходящих HTTP-запросов |
EXPORTER_AKKA_HTTP_SERVER_MAXCON |
int | нет | 1024 |
Максимальное число одновременных входящих HTTP-соединений |
EXPORTER_INTERNALCMD_ALLOW |
bool | нет | false |
Можно ли сервису отправлять внутрисистемные команды |
EXPORTER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD |
duration string | нет | 10 minutes |
Время кэширования данных по командам из CommandDiscovery |
EXPORTER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD |
duration string | нет | 30 seconds |
Время кэширования данных по сервисам из ServiceDiscovery |
EXPORTER_DB_HOST |
string | да | Хост БД | |
EXPORTER_DB_PORT |
int | да | Порт БД | |
EXPORTER_DB_NAME |
string | да | Имя базы в БД | |
EXPORTER_DB_URL |
jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
EXPORTER_DB_USER |
string | да | Пользователь БД | |
EXPORTER_DB_PASSWORD |
string | да | Пароль пользователя БД | |
EXPORTER_DB_THREADS |
int | нет | 10 |
Количество потоков в пуле потоков для соединения с БД |
EXPORTER_DB_QUEUE_SIZE |
int | нет | 300 |
Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
EXPORTER_DB_CONN_MAX |
int | нет | 10 |
Максимальное количество одновременных подключений к БД |
EXPORTER_DB_CONN_TIMEOUT |
duration string | нет | 20 second |
Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
EXPORTER_DB_ISOLATION |
string | нет | READ_COMMITTED |
Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
EXPORTER_DB_READONLY |
boolean | нет | false |
Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
EXPORTER_DB_CONN_MIN |
int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
EXPORTER_DB_VALIDATION_TIMEOUT |
duration string | нет | 1 seconds |
Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
EXPORTER_DB_IDLE_TIMEOUT |
duration string | нет | 10 minutes |
Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
EXPORTER_DB_MAX_LIFETIME |
duration string | нет | 30 minutes |
Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
EXPORTER_DB_INITIALIZATION_FAIL_FAST |
string | нет | false |
Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
EXPORTER_DB_LEAK_DETECTION_THRESHOLD |
int | нет | 0 |
Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
EXPORTER_DB_CONNECTION_TEST_QUERY |
string | нет | SELECT 1 |
Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
EXPORTER_DB_REGISTER_MBEANS |
boolean | нет | false |
Зарегистрированы ли JMX Management Beans («MBeans») |
EXPORTER_DB_AUTO_COMMIT |
boolean | нет | true |
Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
EXPORTER_DB_SCHEMA |
string | нет | public |
Устанавливает schema по умолчанию |
EXPORTER_DB_ISOLATE_INTERNAL_QUERIES |
boolean | нет | false |
Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
EXPORTER_DB_INITIALIZATION_FAIL_TIMEOUT |
int | нет | 1 |
Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
EXPORTER_LOG_LEVEL |
string | нет | INFO |
Общий уровень логирования в сервисе |
EXPORTER_LOG_LEVEL_AKKA |
string | нет | INFO |
Уровень логирования для akka |
EXPORTER_LOG_LEVEL_LIQUIBASE |
string | нет | INFO |
Уровень логирования для liquibase (миграции) |
EXPORTER_LOG_LEVEL_APPLICATION |
string | нет | DEBUG |
Уровень логирования для application |
EXPORTER_LOG_LEVEL_SLICK_STATEMENT |
string | нет | DEBUG |
Уровень логирования запросов, отправляемых slick в БД |
EXPORTER_LOG_LEVEL_SLICK_BENCHMARK |
string | нет | OFF |
Уровень логирование бенчмарков выполнения запросов slick |
EXPORTER_LOG_LEVEL_KAFKA_PRODUCER |
string | нет | WARN |
Уровень логирования конфига kafka-producer |
EXPORTER_LOG_LEVEL_KAFKA_CONSUMER |
string | нет | WARN |
Уровень логирования конфига kafka-consumer |
EXPORTER_LOG_LEVEL_AKKAHTTPSENDER |
string | нет | TRACE |
Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
EXPORTER_LOG_LEVEL_KAFKASENDER |
string | нет | TRACE |
Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
EXPORTER_LOG_LEVEL_COMMANDSTATUSCLI |
string | нет | TRACE |
Уровень логирования для проверки состояний команд в сервисе статусов |
EXPORTER_LOG_LEVEL_TEAM_ROUTES |
string | нет | TRACE |
Уровень логирования для роутов /team |
EXPORTER_REPORT_BUCKET |
string | да | exporter |
Название ведра для отчётов экспорта в S3-подобном файлом хранилище |
EXPORTER_REPORT_PATH |
string | да | report |
Префикс для названия отчётов экспорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
EXPORTER_EXPORT_BUCKET |
string | да | exporter |
Название ведра для пользовательских файлов экспорта в S3-подобном файлом хранилище |
EXPORTER_EXPORT_PATH |
string | да | export |
Префикс для названия пользовательских файлов экспорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
EXPORTER_FILL_WARNINGS |
boolean | да | false |
Флаг для включения возможности добавлять предупреждения при получении данных для экспорта в модель данных |
EXPORTER_JOURNAL_MODE |
string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
EXPORTER_JOURNAL_TOPIC |
string | да, если переменная EXPORTER_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
EXPORTER_RICH_LIST_OBJECTS_PAGING_COUNT |
int | нет | 10000 |
Количество строк в одной странице ответа richListObjects из datamodel |
EXPORTER_EXPORT_ADDRESS |
string | да | http://localhost:{app.http.port} |
Адрес обращения к datamodel для конструирования гиперссылки |
Список команд сервиса Exporter
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions |
|---|---|---|
| Список всех заданий экспорта | ExportProcess |
ListExportProcess |
| Получить задание экспорта по ID | ExportProcess |
GetExportProcess |
| Создать задание экспорта | ExportProcess |
CreateExportProcess |
| Отредактировать задание экспорта | ExportProcess |
UpdateExportProcess |
| Удалить задание экспорта | ExportProcess |
DeleteExportProcess |
| Запуск процесса экспорта данных | ExportProcess |
ExecuteExportProcess |
| Остановка процесса экспорта данных | ExportProcess |
ExecuteExportProcess |
| Получить прогресс процесса экспорта данных | ExportProcess |
GetExportProgress |
| Создание и запуск процесса экспорта данных | ExportProcess |
CreateExportProcess, ExecuteExportProcess |
| Список всех шаблонов заданий экспорта | ExportTemplate |
ListExportTemplate |
| Получить щаблон задания экспорта по ID | ExportTemplate |
GetExportTemplate |
| Создать шаблон задания экспорта | ExportTemplate |
CreateExportTemplate |
| Отредактировать шаблон задания экспорта | ExportTemplate |
UpdateExportTemplate |
| Удалить шаблон задания экспорта | ExportTemplate |
DeleteExportTemplate |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
ListExportProcess
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "entityType",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"status": "DRAFT",
"exportConfig": {
"title": "Sample Project Title"
},
"exportFile": "some file",
"resultFile": null,
"info": {},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"executed": null,
"executedBy": null,
"version": 1
}
],
"total": 1
}
Возвращает список всех задач экспорта.
Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ExportProcess]
| Команда | Путь |
|---|---|
exporter_ListExportProcess |
HTTP POST "/v1/exportProcess/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
id |
InSetQuery |
entityType |
InSetQuery, LikeQuery, TsQuery |
status |
InSetQuery |
created |
RangeQuery |
createdBy |
InSetQuery |
modified |
RangeQuery |
modifiedBy |
InSetQuery |
executed |
RangeQuery |
executedBy |
InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
entityType |
status |
created |
modified |
executed |
GetExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"status": "DRAFT",
"exportConfig": {
"title": "Sample Project Title"
},
"exportFile": "some file",
"resultFile": null,
"info": {},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"executed": null,
"executedBy": null,
"version": 1
}
Поиск задачи экспорта с заданным идентификатором.
Поддерживается только синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: ExportProcess
| Команда | Путь |
|---|---|
exporter_GetExportProcess |
HTTP POST "/v1/exportProcess/get" |
CreateExportProcess
Payload для команды
{
"entityType": "abc",
"exportConfig": {
"title": "Sample Project Title"
},
"exportFile": "some file",
"exportFileName": "export"
}
Результат выполнения команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Добавляет новую задачу экспорта с заданными параметрами.
exportFileName - поле, указывающее название файла. Если оно указано, так и запишется в таблицу ExportProcess. Если не указано - попытается взять из таблицы ExportTemplate по переданному exportTemplateId. Иначе поле будет пустое и файл будет иметь дефолтное название.
Отправляет событие о создании задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessCreateDto
- На выходе: ExportProcessId (UUID)
| Команда | Путь |
|---|---|
exporter_CreateExportProcess |
- |
UpdateExportProcess
Payload для команды
{
"id": "f283aac5-88e0-43b5-8dab-56c22d91acc7",
"entityType": "abc",
"exportConfig": {
"startRow": 3,
"columnMapping": [
{
"property": "title",
"columnLabel": "A"
}
]
},
"exportFile": "bucket/file_id",
"version": 1
}
Результат выполнения команды
true
Обновляет данные задачи экспорта. Отправляет событие об обновлении задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_UpdateExportProcess |
- |
DeleteExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Удаляет задачу экспорта с заданным идентификатором. Отправляет событие об удалении задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_DeleteExportProcess |
- |
ExecuteExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Запускает задачу экспорта с заданным идентификатором. Отправляет событие о результатах выполнения задачи экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_ExecuteExportProcess |
- |
CancelExportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Останавливает запущенную задачу экспорта с заданным идентификатором.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_CancelExportProcess |
- |
GetExportProgress
Payload для команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
}
Результат выполнения команды
{
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd": {
"estimateTime": "PT12H54M5.02S",
"percent": 0.3368487274760384,
"stats": [
{
"name": "?",
"processed": {
"succeed": 0,
"skipped": 1723,
"total": 1723
},
"errors": 0
}
]
}
}
Прогресс задач экспорта. Можно отфильтровать по идентификатору конкретной задачи. Поддерживается только синхронный вызов.
- На входе: GetExportProgressDto
- На выходе: Map[ExportProcessId, [EstimateProgressStats]]
| Команда | Путь |
|---|---|
| exporter_GetExportProgress | - |
CreateAndExecuteExportProcess
Payload для команды
{
"entityType": "Tag",
"exportConfig": {
"columnMapping": [
{
"columnLabel": "C",
"columnHeader": "Заголовок",
"attributePath": [
{
"fieldCode": "title",
"fieldType": "string"
}
]
},
{
"columnLabel": "A",
"columnHeader": "Код",
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
{
"columnLabel": "D",
"columnHeader": "Диаметр",
"attributePath": [
{
"fieldCode": "diametr",
"fieldType": "number"
}
]
},
{
"columnLabel": "E",
"columnHeader": "subType",
"attributePath": [
{
"fieldCode": "subType",
"fieldType": "catalogItem",
"catalogCode": "TagSubType"
},
{
"fieldCode": "tagTypeTitle",
"fieldType": "string"
}
]
},
{
"columnLabel": "F",
"columnHeader": "complex code",
"attributePath": [
{
"fieldCode": "complex",
"fieldType": "entityObject",
"entityType": "complex"
},
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
{
"columnLabel": "G",
"columnHeader": "complex title",
"attributePath": [
{
"fieldCode": "complex",
"fieldType": "entityObject",
"entityType": "complex"
},
{
"fieldCode": "title",
"fieldType": "string"
}
]
}
]
},
"search": {
"query": "",
"context": {
}
},
"hierarchy": [],
"exportFileName": "export"
}
Результат выполнения команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Последовательное выполнение команд CreateExportProcess и ExecuteExportProcess.
Добавляет новую задачу экспорта с заданными параметрами, а затем ее запускает.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportProcessCreateDto
- На выходе: ExportProcessId (UUID)
| Команда | Путь |
|---|---|
exporter_CreateAndExecuteExportProcess |
- |
ListExportTemplate
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "entityType",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"title": "Наименование шаблона",
"description": "Описание которое на которое никто не смотрит",
"exportConfig": {
"title": "Sample Project Title"
},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 1
}
],
"total": 1
}
Возвращает список всех шаблонов экспорта.
Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ExportTemplate]
| Команда | Путь |
|---|---|
exporter_ListExportTemplate |
HTTP POST "/v1/exportTemplate/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
id |
InSetQuery |
entityType |
InSetQuery, LikeQuery, TsQuery |
createdBy |
InSetQuery |
title |
LikeQuery |
description |
LikeQuery |
Доступные поля для сортировки:
| Поле |
|---|
entityType |
created |
modified |
GetExportTemplate
Payload для команды
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
Результат выполнения команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"title": "Наименование шаблона",
"description": "Описание которое на которое никто не смотрит",
"exportConfig": {
"title": "Sample Project Title"
},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 1
}
Поиск задачи экспорта с заданным идентификатором.
Поддерживается только синхронный вызов.
- На входе: ExportTemplateId (UUID)
- На выходе: ExportTemplate
| Команда | Путь |
|---|---|
exporter_GetExportTemplate |
HTTP POST "/v1/exportTemplate/get" |
CreateExportTemplate
Payload для команды
{
"entityType": "abc",
"title": "Шаблон всего",
"description": "Описание шаблона на которое никто не смотрит",
"exportConfig": {
"title": "Sample Project Title"
}
}
Результат выполнения команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Добавляет новый шаблон экспорта с заданными параметрами. Отправляет событие о создании шаблона экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportTemplateCreateDto
- На выходе: ExportTemplateId (UUID)
| Команда | Путь |
|---|---|
exporter_CreateExportTemplate |
- |
UpdateExportTemplate
Payload для команды
{
"id": "f283aac5-88e0-43b5-8dab-56c22d91acc7",
"entityType": "abc",
"title": "Шаблон всего",
"description": "Описание шаблона на которое никто не смотрит",
"exportConfig": {
"startRow": 3,
"columnMapping": [
{
"property": "title",
"columnLabel": "A"
}
]
},
"version": 1
}
Результат выполнения команды
true
Обновляет данные шаблона экспорта. Отправляет событие об обновлении шаблона экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportTemplateUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_UpdateExportTemplate |
- |
DeleteExportTemplate
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Удаляет шаблон экспорта с заданным идентификатором. Отправляет событие об удалении шаблона экспорта.
Поддерживается асинхронный и синхронный вызов.
- На входе: ExportTemplateId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
exporter_DeleteExportTemplate |
- |
Модели сервиса Exporter
ExportProcessCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
exportTemplateId |
ExportTemplateId (UUID) | Нет | Уникальный идентификатор шаблона |
exportConfig |
ExportConfig | Нет | Конфигурация экспорта |
search |
Search | Нет | Параметры поиска для выбора элементов |
hierarchyId |
HierarchyId (UUID) | Нет | Уникальный идентификатор иерархии |
hierarchy |
Json (Object) | Нет | Параметры иерархической структуры выгрузки файлов |
processFileFields |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать связанные файлы, даже если в конфиге указано поле с файлом |
processHierarchy |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать файлы в иерархическом порядке, даже если прокинута иерархия |
preserveEmptyFolders |
Boolean | Да | Флаг, указывающий на то надо ли добавлять в иерархию пустые папки (без выгружаемых файлов) |
exportFileName |
String | Нет | Имя создаваемого файла |
ExportProcessUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportProcessId (UUID) | Да | Уникальный идентификатор задачи |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFileName |
String | Нет | Имя создаваемого файла |
search |
Search | Нет | Параметры поиска для выбора элементов |
hierarchy |
Json (Object) | Нет | Параметры иерархической структуры выгрузки файлов |
version |
Int | Да | Индекс оптимистической блокировки |
ExportProcess
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportProcessId (UUID) | Да | Уникальный идентификатор задачи |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
status |
ExportProcessStatus (String) | Да | Состояние задачи (DRAFT, IN PROGRESS, IN PROGRESS ARCHIVE, SUCCESS, ERROR, CANCELED) |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFile |
ExportFileInformation[] | Да | URI и имя файла |
info |
ExportInfo | Да | Статистика по экспорту (summary) |
search |
Search | Нет | Параметры поиска для выбора элементов |
hierarchy |
Json (Object) | Нет | Параметры иерархической структуры выгрузки файлов |
processFileFields |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать связанные файлы, даже если в конфиге указано поле с файлом |
processHierarchy |
Boolean | Да | Флаг при снятии которого процесс выгрузки не должен выгружать файлы в иерархическом порядке, даже если прокинута иерархия |
preserveEmptyFolders |
Boolean | Да | Флаг, указывающий на то надо ли добавлять в иерархию пустые папки (без выгружаемых файлов) |
exportFileName |
String | Нет | Имя создаваемого файла |
created |
Timestamp (Long) | Да | Дата создания записи |
createdBy |
UserId (UUID) | Да | ID пользователя создавшего запись |
modified |
Timestamp (Long) | Да | Дата изменения записи |
modifiedBy |
UserId (UUID) | Да | ID пользователя изменившего запись |
executed |
Timestamp (Long) | Нет | Дата запуска экспорта |
executedBy |
UserId (UUID) | Нет | ID пользователя запустившего экспорт |
version |
Int | Да | Индекс оптимистической блокировки |
ExportTemplateCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
title |
Title (String) | Да | Наименование шаблона |
description |
String | Нет | Описание шаблона |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFileName |
String | Нет | Имя создаваемого файла |
ExportTemplateUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportTemplateId (UUID) | Да | Уникальный идентификатор шаблона |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
title |
Title (String) | Да | Наименование шаблона |
description |
String | Нет | Описание шаблона |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
exportFileName |
String | Нет | Имя создаваемого файла |
version |
Int | Да | Индекс оптимистической блокировки |
ExportTemplate
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
ExportTemplateId (UUID) | Да | Уникальный идентификатор шаблона |
entityType |
EntityTypeId (String) | Да | Тип экспортируемой сущности |
title |
Title (String) | Да | Наименование шаблона |
description |
String | Нет | Описание шаблона |
exportConfig |
ExportConfig | Да | Конфигурация экспорта |
created |
Timestamp (Long) | Да | Дата создания записи |
createdBy |
UserId (UUID) | Да | ID пользователя создавшего запись |
modified |
Timestamp (Long) | Да | Дата изменения записи |
modifiedBy |
UserId (UUID) | Да | ID пользователя изменившего запись |
version |
Int | Да | Индекс оптимистической блокировки |
ExportConfig
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
columnMapping |
ColumnMapping[] | Да | Информация о сопоставлении столбцов из файла и данных сущности |
ColumnMapping
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
columnLabel |
String | Да | Наименование колонки для экспорта данных |
columnHeader |
String | Да | Название колонки |
attributePath |
FieldAttribute[] | Да | Описание пути для получения данных поля |
FieldAttribute
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
fieldType |
String | Да | Тип ожидаемых данных (допустимые значения: string, number, entityObject, catalogItem, file) |
fieldCode |
String | Да | Поле из которого берутся данные |
entityType |
String | Нет | Тип сущности по которое происходит переход для типа данных entityObject |
catalogCode |
String | Нет | Каталог по которому происходит переход для типа данных catalogItem |
ExportFileInformation
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
fileName |
String | Да | Имя файла загруженного для экспорта |
url |
String | Да | URI файла экспорта (стандартная FS загрузка) |
ExportInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
progress |
ProgressInfo | Да | Статистика процесса обработки |
error |
String | Нет | Ошибка, если был неуспешный запуск |
warnings |
List[(Int, String)] | Нет | Предупреждения загрузки данных |
ProgressInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
percent |
Double | Да | Процент выполненного прогресса загрузки (от 0.0 до 100.0) |
progress |
Int | Нет | Кол-во выполненных шагов |
total |
Int | Нет | Общее кол-во шагов |
GetExportProgressDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ExportProcessId (UUID) | Нет | Получить статистику только для указанной задачи |
EstimateProgressStats
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| estimateTime | Duration ISO8601 | Да | Время до конца в таком формате PT12H54M5.02S |
| percent | Double | Да | Процент выполнения (уже рассчитанные цифры из stats) |
| stats | SheetExportTotalStatistic[] | Да | Числа статистики по листам |
SheetExportTotalStatistic
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| name | String | Да | Название листа |
| processed | StatFraction | Да | Количество обработанных строк |
| errors | Int | Да | Количество ошибок |
StatFraction
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| succeed | Int | Да | Успешно обработано |
| skipped | Int | Нет | Пропущено |
| total | Int | Да | Всего операций |
Importer: сервис для примера
Сервис принимает команды для работы с игроками и командами. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик importer_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/importer_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- IMPORTER_DB_HOST
- IMPORTER_DB_PORT
- IMPORTER_DB_NAME
- IMPORTER_DB_USER
- IMPORTER_DB_PASSWORD
Запуск из консоли с помощью SBT
IMPORTER_DB_HOST=localhost IMPORTER_DB_PORT=5432 IMPORTER_DB_NAME=importer_db IMPORTER_DB_USER=postgres IMPORTER_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса Importer
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| IMPORTER_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| IMPORTER_HTTP_PORT | int | нет | 8192 | Порт, на котором слушает HTTP-сервер |
| IMPORTER_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| IMPORTER_KAFKA_TOPIC | string | нет | "importer_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| IMPORTER_KAFKA_CONSUMER_GROUP | string | нет | "importer_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| IMPORTER_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| IMPORTER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| IMPORTER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| IMPORTER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| IMPORTER_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| IMPORTER_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| IMPORTER_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| IMPORTER_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. |
| IMPORTER_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к харнилищу сертификатов. |
| IMPORTER_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| IMPORTER_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| IMPORTER_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| IMPORTER_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| IMPORTER_DISCOVERABLE_ID | string | нет | "another_IMPORTER_service_instance" | ID сервиса в ServiceDiscovery |
| IMPORTER_DISCOVERABLE_NAME | string | нет | "importer" | Имя сервиса в ServiceDiscovery |
| IMPORTER_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| IMPORTER_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| IMPORTER_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| IMPORTER_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| IMPORTER_SERVICE_TITLE | string | нет | "Importer" | Название сервиса для отображения |
| IMPORTER_SERVICE_DESCRIPTION | string | нет | "Service IMPORTER" | Описание сервиса для отображения |
| IMPORTER_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| IMPORTER_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| IMPORTER_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| IMPORTER_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| IMPORTER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| IMPORTER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| IMPORTER_DB_HOST | string | да | Хост БД | |
| IMPORTER_DB_PORT | int | да | Порт БД | |
| IMPORTER_DB_NAME | string | да | Имя базы в БД | |
| IMPORTER_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| IMPORTER_DB_USER | string | да | Пользователь БД | |
| IMPORTER_DB_PASSWORD | string | да | Пароль пользователя БД | |
| IMPORTER_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| IMPORTER_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| IMPORTER_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| IMPORTER_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| IMPORTER_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| IMPORTER_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| IMPORTER_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| IMPORTER_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| IMPORTER_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| IMPORTER_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| IMPORTER_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| IMPORTER_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| IMPORTER_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| IMPORTER_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| IMPORTER_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| IMPORTER_DB_SCHEMA | string | нет | "public" | Устанавливает schema по умолчанию |
| IMPORTER_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| IMPORTER_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| IMPORTER_LOG_LEVEL | string | нет | INFO | Общий уровень логирования в сервисе |
| IMPORTER_LOG_LEVEL_AKKA | string | нет | INFO | Уровень логирования для akka |
| IMPORTER_LOG_LEVEL_LIQUIBASE | string | нет | INFO | Уровень логирования для liquibase (миграции) |
| IMPORTER_LOG_LEVEL_APPLICATION | string | нет | DEBUG | Уровень логирования для application |
| IMPORTER_LOG_LEVEL_SLICK_STATEMENT | string | нет | DEBUG | Уровень логирования запросов, отправляемых slick в БД |
| IMPORTER_LOG_LEVEL_SLICK_BENCHMARK | string | нет | OFF | Уровень логирование бенчмарков выполнения запросов slick |
| IMPORTER_LOG_LEVEL_KAFKA_PRODUCER | string | нет | WARN | Уровень логирования конфига kafka-producer |
| IMPORTER_LOG_LEVEL_KAFKA_CONSUMER | string | нет | WARN | Уровень логирования конфига kafka-consumer |
| IMPORTER_LOG_LEVEL_AKKAHTTPSENDER | string | нет | TRACE | Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
| IMPORTER_LOG_LEVEL_KAFKASENDER | string | нет | TRACE | Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
| IMPORTER_LOG_LEVEL_COMMANDSTATUSCLI | string | нет | TRACE | Уровень логирования для проверки состояний команд в сервисе статусов |
| IMPORTER_LOG_LEVEL_TEAM_ROUTES | string | нет | TRACE | Уровень логирования для роутов /team |
| IMPORTER_REPORT_BUCKET | string | да | importer | Название ведра для отчётов импорта в S3-подобном файлом хранилище |
| IMPORTER_REPORT_PATH | string | да | report | Префикс для названия отчётов импорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
| IMPORTER_IMPORT_BUCKET | string | да | importer | Название ведра для пользовательских файлов импорта в S3-подобном файлом хранилище |
| IMPORTER_IMPORT_PATH | string | да | import | Префикс для названия пользовательских файлов импорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
| IMPORTER_JOURNAL_MODE | string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
| IMPORTER_JOURNAL_TOPIC | string | да, если переменная IMPORTER_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
Список команд сервиса Importer
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions |
|---|---|---|
| Список всех заданий импорта | ImportProcess | ListImportProcess |
| Получить задание импорта по ID | ImportProcess | GetImportProcess |
| Создать задание импорта | ImportProcess | CreateImportProcess |
| Отредактировать задание импорта | ImportProcess | UpdateImportProcess |
| Удалить задание импорта | ImportProcess | DeleteImportProcess |
| Запуск задания импорта по ID | ImportProcess | ExecuteImportProcess |
| Отмена задания импорта по ID | ImportProcess | ExecuteImportProcess |
| Получить прогресс задачи импорта | ImportProcess | ListImportProcess |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
ListImportProcess
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "entityType",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"status": "DRAFT",
"importConfig": {
"title": "Sample Project Title"
},
"importFile": "some file",
"resultFile": null,
"info": {},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"executed": null,
"executedBy": null,
"version": 1
}
],
"total": 1
}
Возвращает список всех задач импорта. Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ImportProcess]
| Команда | Путь |
|---|---|
| importer_ListImportProcess | HTTP POST "/v1/importProcess/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| entityType | InSetQuery, LikeQuery, TsQuery |
| status | InSetQuery |
| created | RangeQuery |
| createdBy | InSetQuery |
| modified | RangeQuery |
| modifiedBy | InSetQuery |
| executed | RangeQuery |
| executedBy | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| entityType |
| status |
| created |
| createdBy |
| modified |
| modifiedBy |
| executed |
| executedBy |
GetImportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd",
"entityType": "abc",
"status": "DRAFT",
"importConfig": {
"title": "Sample Project Title"
},
"importFile": "some file",
"resultFile": null,
"info": {},
"created": 1723809067603,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723809067603,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"executed": null,
"executedBy": null,
"version": 1
}
Поиск задачи импорта с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: ImportProcessId (UUID)
- На выходе: ImportProcess
| Команда | Путь |
|---|---|
| importer_GetImportProcess | HTTP POST "/v1/importProcess/get" |
CreateImportProcess
Payload для команды
{
"entityType": "abc",
"importConfig": {
"title": "Sample Project Title"
},
"importFile": "some file"
}
Результат выполнения команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Добавляет новую задачу импорта с заданными параметрами. Отправляет событие о создании задачи импорта.
- На входе: ImportProcessCreateDto
- На выходе: ImportProcessId (UUID)
| Команда | Путь |
|---|---|
| importer_CreateImportProcess | - |
UpdateImportProcess
Payload для команды
{
"id": "f283aac5-88e0-43b5-8dab-56c22d91acc7",
"entityType": "abc",
"importConfig": {
"startRow": 3,
"columnMapping": [
{
"property": "title",
"columnLabel": "A"
}
]
},
"importFile": "bucket/file_id",
"version": 1
}
Результат выполнения команды
true
Обновляет данные задачи импорта. Отправляет событие об обновлении задачи импорта.
- На входе: ImportProcessUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
| importer_UpdateImportProcess | - |
DeleteImportProcess
Payload для команды
"f283aac5-88e0-43b5-8dab-56c22d91acc7"
Результат выполнения команды
true
Удаляет задачу импорта с заданным идентификатором. Отправляет событие об удалении задачи импорта.
- На входе: ImportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| importer_DeleteImportProcess | - |
ExecuteImportProcess
Payload для команды
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
Результат выполнения команды
true
Запускает задачу импорта с заданным идентификатором. Отправляет событие о результатах выполнения задачи импорта.
- На входе: ImportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| importer_ExecuteImportProcess | - |
CancelImportProcess
Payload для команды
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
Результат выполнения команды
true
Остановка задачи импорта с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: ImportProcessId (UUID)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| importer_CancelImportProcess | - |
GetImportProgress
Payload для команды
{
"id": "b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"
}
Результат выполнения команды
{
"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd": {
"estimateTime": "PT12H54M5.02S",
"percent": 0.3368487274760384,
"stats": [
{
"name": "Лист1",
"updates": {
"succeed": 0,
"skipped": 1723,
"total": 1723
},
"creates": {
"succeed": 569,
"skipped": null,
"total": 3277
},
"deleteRelations": {
"succeed": 0,
"skipped": null,
"total": 0
},
"createRelations": {
"succeed": 1139,
"skipped": null,
"total": 6555
},
"errors": 2
}
]
}
}
Прогресс задач импорта. Можно отфильтровать по идентификатору конкретной задачи. Поддерживается только синхронный вызов.
- На входе: GetImportProgressDto
- На выходе: Map[ImportProcessId, [EstimateProgressStats]]
| Команда | Путь |
|---|---|
| importer_GetImportProgress | - |
Модели сервиса Importer
ImportProcessCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | EntityTypeId (String) | Да | Тип импортируемой сущности |
| importConfig | JSON (Object) | Да | Конфигурация импорта |
| importFile | String | Да | URI файла (стандартная FS загрузка) |
ImportProcessUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ImportProcessId (UUID) | Да | Уникальный идентификатор задачи |
| entityType | EntityTypeId (String) | Да | Тип импортируемой сущности |
| importConfig | JSON (Object) | Да | Конфигурация импорта |
| importFile | String | Да | URI файла (стандартная FS загрузка) |
| version | Int | Да | Индекс оптимистической блокировки |
ImportProcess
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ImportProcessId (UUID) | Да | Уникальный идентификатор задачи |
| entityType | EntityTypeId (String) | Да | Тип импортируемой сущности |
| status | ImportProcessStatus (String) | Да | Состояние задачи (DRAFT, IN PROGRESS, SUCCESS, ERROR) |
| importConfig | ImportConfig | Да | Конфигурация импорта |
| importFile | ImportFileInformation[] | Да | URI и имя файла |
| resultFile | ReportInformation[] | Нет | URI файла отчёта, кем и когда запущен, индекс файла импорта |
| info | ImportInfo | Да | Статистика по импорту (summary) |
| created | Long | Да | Дата создания записи |
| modified | Long | Да | Дата изменения записи |
| executed | Long | Нет | Дата изменения записи |
| createdBy | UserId (UUID) | Да | ID пользователя создавшего запись |
| modifiedBy | UserId (UUID) | Да | ID пользователя изменившего запись |
| executedBy | UserId (UUID) | Нет | ID пользователя изменившего запись |
| version | Int | Да | Индекс оптимистической блокировки |
GetImportProgressDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ImportProcessId (UUID) | Нет | Получить статистику только для указанной задачи |
EstimateProgressStats
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| estimateTime | Duration ISO8601 | Да | Время до конца в таком формате PT12H54M5.02S |
| percent | Double | Да | Процент выполнения (уже рассчитанные цифры из stats) |
| stats | SheetImportTotalStatistic[] | Да | Числа статистики по листам |
SheetImportTotalStatistic
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| name | String | Да | Название листа |
| updates | StatFraction | Да | Количество обновлений |
| inserts | StatFraction | Да | Количество созданий |
| deleteRelations | StatFraction | Да | Количество удаленных связей |
| createRelations | StatFraction | Да | Количество созданных связей |
| errors | Int | Да | Количество ошибок |
StatFraction
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| succeed | Int | Да | Успешно обработано |
| skipped | Int | Нет | Пропущено |
| total | Int | Да | Всего операций |
ImportConfig
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| startRow | Int | Нет | С какой строки начать импорт |
| columnMapping | ColumnMapping[] | Да | Информация о сопоставлении столбцов из файла и данных сущности |
| allowDeleteRelations | Boolean | Нет | Разрешить удалять связи (в том числе при пустых ячейках исходя из конфигурации) |
| multipleValueSeparator | Boolean | Нет | Разделитель при перечислении у множественных полей |
ColumnMapping
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| columnLabel | String | Да | Название колонки файла, содержащей данные |
| property | String | Да | Атрибут сущности, в который загружаются данные из колонки |
| propertyPKField | String | Нет | Опциональное значение, указывающее атрибут связанного объекта или каталога,по которому будет осуществляться поиск соответствующего объекта |
| isPKProperty | Boolean | Нет | Использовать для загрузки это поле в качестве первичного ключа |
| isExternalId | Boolean | Нет | Использовать для загрузки это поле в качестве внешнего ID |
ImportFileInformation
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileName | String | Да | Имя файла загруженного для импорта |
| importUrl | String | Да | URI файла импорта (стандартная FS загрузка) |
ReportInformation
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| importFileIdx | Int | Да | Индекс файла из поля importFile (ImportFileInformation[]) |
| reportUrl | String | Да | URI файла отчёта (стандартная FS загрузка) |
| executedBy | UserId (UUID) | Да | Кем запущен |
| executed | TimeStamp (Long) | Да | Время завершения импорта (формируется ближе к концу процесса) |
ImportInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| error | String | Нет | Ошибка, если был неуспешный запуск |
| stats | Int | SheetImportTotalStatistic | Статистика для первого листа |
Package-importer: сервис для пакетной загрузки
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/package_importer_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- PACKAGE_IMPORTER_DB_HOST
- PACKAGE_IMPORTER_DB_PORT
- PACKAGE_IMPORTER_DB_NAME
- PACKAGE_IMPORTER_DB_USER
- PACKAGE_IMPORTER_DB_PASSWORD
Запуск из консоли с помощью SBT
PACKAGE_IMPORTER_DB_HOST=localhost PACKAGE_IMPORTER_DB_PORT=5432 PACKAGE_IMPORTER_DB_NAME=importer_db PACKAGE_IMPORTER_DB_USER=postgres PACKAGE_IMPORTER_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса package-importer
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| PACKAGE_IMPORTER_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| PACKAGE_IMPORTER_HTTP_PORT | int | нет | 8192 | Порт, на котором слушает HTTP-сервер |
| PACKAGE_IMPORTER_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| PACKAGE_IMPORTER_KAFKA_TOPIC | string | нет | "package_importer_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| PACKAGE_IMPORTER_KAFKA_CONSUMER_GROUP | string | нет | "package_importer_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| PACKAGE_IMPORTER_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| PACKAGE_IMPORTER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| PACKAGE_IMPORTER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| PACKAGE_IMPORTER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| PACKAGE_IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| PACKAGE_IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который IMPORTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| PACKAGE_IMPORTER_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| PACKAGE_IMPORTER_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| PACKAGE_IMPORTER_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| PACKAGE_IMPORTER_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. |
| PACKAGE_IMPORTER_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к харнилищу сертификатов. |
| PACKAGE_IMPORTER_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| PACKAGE_IMPORTER_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| PACKAGE_IMPORTER_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| PACKAGE_IMPORTER_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| PACKAGE_IMPORTER_DISCOVERABLE_ID | string | нет | "another__PACKAGE_IMPORTER_service_instance" | ID сервиса в ServiceDiscovery |
| PACKAGE_IMPORTER_DISCOVERABLE_NAME | string | нет | "importer" | Имя сервиса в ServiceDiscovery |
| PACKAGE_IMPORTER_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| PACKAGE_IMPORTER_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| PACKAGE_IMPORTER_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| PACKAGE_IMPORTER_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| PACKAGE_IMPORTER_SERVICE_TITLE | string | нет | "Importer" | Название сервиса для отображения |
| PACKAGE_IMPORTER_SERVICE_DESCRIPTION | string | нет | "Service PACKAGE IMPORTER" | Описание сервиса для отображения |
| PACKAGE_IMPORTER_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| PACKAGE_IMPORTER_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| PACKAGE_IMPORTER_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| PACKAGE_IMPORTER_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| PACKAGE_IMPORTER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| PACKAGE_IMPORTER_IMPORTER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| PACKAGE_IMPORTER_DB_HOST | string | да | Хост БД | |
| PACKAGE_IMPORTER_DB_PORT | int | да | Порт БД | |
| PACKAGE_IMPORTER_DB_NAME | string | да | Имя базы в БД | |
| PACKAGE_IMPORTER_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| PACKAGE_IMPORTER_DB_USER | string | да | Пользователь БД | |
| PACKAGE_IMPORTER_DB_PASSWORD | string | да | Пароль пользователя БД | |
| PACKAGE_IMPORTER_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| PACKAGE_IMPORTER_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| PACKAGE_IMPORTER_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| PACKAGE_IMPORTER_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| PACKAGE_IMPORTER_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| PACKAGE_IMPORTER_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| PACKAGE_IMPORTER_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| PACKAGE_IMPORTER_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| PACKAGE_IMPORTER_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| PACKAGE_IMPORTER_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| PACKAGE_IMPORTER_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| PACKAGE_IMPORTER_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| PACKAGE_IMPORTER_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| PACKAGE_IMPORTER_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| PACKAGE_IMPORTER_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| PACKAGE_IMPORTER_DB_SCHEMA | string | нет | "public" | Устанавливает schema по умолчанию |
| PACKAGE_IMPORTER_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| PACKAGE_IMPORTER_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| PACKAGE_IMPORTER_LOG_LEVEL | string | нет | INFO | Общий уровень логирования в сервисе |
| PACKAGE_IMPORTER_LOG_LEVEL_AKKA | string | нет | INFO | Уровень логирования для akka |
| PACKAGE_IMPORTER_LOG_LEVEL_LIQUIBASE | string | нет | INFO | Уровень логирования для liquibase (миграции) |
| PACKAGE_IMPORTER_LOG_LEVEL_APPLICATION | string | нет | DEBUG | Уровень логирования для application |
| PACKAGE_IMPORTER_LOG_LEVEL_SLICK_STATEMENT | string | нет | DEBUG | Уровень логирования запросов, отправляемых slick в БД |
| PACKAGE_IMPORTER_LOG_LEVEL_SLICK_BENCHMARK | string | нет | OFF | Уровень логирование бенчмарков выполнения запросов slick |
| PACKAGE_IMPORTER_LOG_LEVEL_KAFKA_PRODUCER | string | нет | WARN | Уровень логирования конфига kafka-producer |
| PACKAGE_IMPORTER_LOG_LEVEL_KAFKA_CONSUMER | string | нет | WARN | Уровень логирования конфига kafka-consumer |
| PACKAGE_IMPORTER_LOG_LEVEL_AKKAHTTPSENDER | string | нет | TRACE | Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
| PACKAGE_IMPORTER_LOG_LEVEL_KAFKASENDER | string | нет | TRACE | Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
| PACKAGE_IMPORTER_LOG_LEVEL_COMMANDSTATUSCLI | string | нет | TRACE | Уровень логирования для проверки состояний команд в сервисе статусов |
| PACKAGE_IMPORTER_LOG_LEVEL_TEAM_ROUTES | string | нет | TRACE | Уровень логирования для роутов /team |
| PACKAGE_IMPORTER_REPORT_BUCKET | string | да | package-importer | Название ведра для отчётов импорта в S3-подобном файлом хранилище |
| PACKAGE_IMPORTER_REPORT_PATH | string | да | report | Префикс для названия отчётов импорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
| PACKAGE_IMPORTER_IMPORT_BUCKET | string | да | package-importer | Название ведра для пользовательских файлов импорта в S3-подобном файлом хранилище |
| PACKAGE_IMPORTER_IMPORT_PATH | string | да | import | Префикс для названия пользовательских файлов импорта в S3-подобном файлом хранилище (выступает в роли поддиректории в ведре S3) |
| PACKAGE_IMPORTER_KAFKA_PACKAGEIMPORTCONFIGEVENT_TOPIC | string | да | packageImportConfigEvents | Топик для событий по конфигам пакетной загрузки |
| PACKAGE_IMPORTER_KAFKA_PACKAGEIMPORTPROCESSEVENT_TOPIC | string | да | packageImportProcessEvents | Топик для событий по процессам пакетной загрузки |
| PACKAGE_IMPORTER_JOURNAL_MODE | string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
| PACKAGE_IMPORTER_JOURNAL_TOPIC | string | да, если переменная PACKAGE_IMPORTER_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
| PACKAGE_IMPORTER_NOT_LOCATED_DIRECTORY_BUCKET | string | нет | "package-importer-not-located" | Место в s3, куда сохраняются нераспределенные файлы |
| PACKAGE_IMPORTER_PARALLEL_ASYNC_PROCESS | int | нет | 4 | Сколько возможно параллельных асихронных процессов пакетной загрузки |
| PACKAGE_IMPORTER_ENABLE_SCHEDULE | bool | нет | false | Включение/выключение работы конфигов по кронам |
| PACKAGE_IMPORTER_MAX_SYNC_PROCESS | int | нет | 4 | Сколько возможно синхронных процессов пакетной загрузки |
| PACKAGE_IMPORTER_RETRY_QUERIES | int | нет | 3 | Сколько раз будем повторять запросы (для избежания ошибок s3 с метадатой) |
| PACKAGE_IMPORTER_BATCH_CIPHER | int | нет | 30 | Сколько шифров мы будем использовать в запросе для получения карточек (объектов из datamodel) |
| PACKAGE_IMPORTER_MAX_UPDATE_OBJECTS | int | нет | 4 | Сколько карточек (объектов) можем одновременно обрабатывать в процессе пакетной загрузки |
| PACKAGE_IMPORTER_MAX_FILES_MOVING_TO_BUCKET | int | нет | 4 | Сколько файлов может одновременно перемещаться/копироваться в бакет s3 |
| NETWORK_AUTH_KEY | string | да | Ключ шифрования логина/пароля сетевой папки | |
| PACKAGE_IMPORTER_LIMIT_LIST_INFO_FILES | int | нет | 1000 | Сколько объектов запрашиваем из датамодела когда получаем инфу о распределенных файлов |
Список команд сервиса Package Importer
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
| Название команды | EntityType | Actions |
|---|---|---|
| Список всех конфигов пакетной загрузки | PackageImportConfig | ListPackageImportConfig |
| Получение конфига пакетной загрузки по ID | PackageImportConfig | GetPackageImportConfig |
| Создать конфиг пакетной загрузки | PackageImportConfig | CreatePackageImportConfig |
| Отредактировать конфиг пакетной загрузки | PackageImportConfig | UpdatePackageImportConfig |
| Удалить конфиг пакетной загрузки | PackageImportConfig | DeletePackageImportConfig |
| Список всех процессов пакетной загрузки | PackageImportProcess | ListPackageImportProcess |
| Получение процесса пакетной загрузки по ID | PackageImportConfig | GetPackageImportProcess |
| Удалить процесс пакетной загрузки | PackageImportProcess | DeletePackageImportProcess |
| Список всех файлов пакетной загрузки | PackageImportFile | ListPackageImportFile |
| Список всех not located файлов пакетной загрузки | PackageImportFile | ListNotLocatedPackageImportFile |
| Массовое дораспределение файлов пакетной загрузки | PackageImportFile | ProcessPackageImportFile |
| Ручное распределение файла в конкретную карточку объекта | PackageImportFile | ProcessPackageImportFile |
| Получение файла пакетной загрузки по ID | PackageImportFile | GetPackageImportFile |
| Удалить журналирование файла пакетной загрузки | PackageImportConfig | DeletePackageImportFile |
| Удалить журналирование файлов пакетной загрузки | PackageImportConfig | DeletePackageImportFileSearch |
| Запустить пакетную загрузку | PackageImportConfig | ExecutePackageImport |
| Запустить локальную пакетную загрузку | PackageImportConfig | ExecuteLocalPackageImport |
| Проверить сетевую папку | PackageImportConfig | CheckNetworkFolder |
| Удаление и остановка работы сущностей пакетной загрузки по проекту | PackageImportConfig | ClearProjectData |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
ListPackageImportConfig
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"title": "title",
"description": "Some testable package import config",
"config": {},
"context": null,
"created": 1723553566671,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723553569099,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 1
}
],
"total": 1
}
Возвращает список всех конфигов пакетной загрузки. Поддерживается только синхронный вызов.
- На входе: Search
- На выходе: Page[PackageImportConfig]
| Команда | Путь |
|---|---|
| packageImporter_ListPackageImportConfig | HTTP POST "/v1/packageImportConfig/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| title | LikeQuery |
| description | LikeQuery |
| createdBy | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| title |
| created |
| modified |
| createdBy |
| modifiedBy |
GetPackageImportConfig
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"title": "title",
"description": "Some testable package import config",
"config": {},
"context": null,
"created": 1723553566671,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723553569099,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 1
}
Поиск конфига пакетной загрузки с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: PackageImportConfigId (String)
- На выходе: PackageImportConfig
| Команда | Путь |
|---|---|
| packageImporter_GetPackageImportConfig | HTTP POST "/v1/packageImportConfig/get" |
CreatePackageImportConfig
Payload для команды
{
"title": "title",
"description": "Some testable package import config",
"config": {}
}
Результат выполнения команды
"some-id"
Добавляет новый конфиг пакетной загрузки. Отправляет событие о создании конфига. Также, если указан cronSettings, пытается запустить новые процессы по крону.
- На входе: PackageImportConfigCreateDto
- На выходе: PackageImportConfigId (String)
| Команда | Путь |
|---|---|
| packageImporter_CreatePackageImportConfig | - |
UpdatePackageImportConfig
Payload для команды
{
"id": "some-id",
"title": "title",
"description": "Some VERY testable package import config (new description)",
"config": {}
}
Результат выполнения команды
true
Обновляет данные о конфиге пакетной загрузки. Отправляет событие об обновлении конфига. Также, если обновляем cronSettings, пытается запустить новые процессы по крону, по старому крону создаваться процессы не будут.
- На входе: PackageImportConfigUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
| packageImporter_UpdatePackageImportConfig | - |
DeletePackageImportConfig
Payload для команды
"some-id"
Результат выполнения команды
true
Удаляет конфиг пакетной загрузки с заданным идентификатором. Отправляет событие об удалении конфига. Удаляет создание новых крон процессов.
- На входе: PackageImportConfigId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| packageImporter_DeletePackageImportConfig | - |
ListPackageImportProcess
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "status",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"packageImportConfigId": "some-config-id",
"status": "IN PROGRESS",
"config": {},
"info": {},
"sourceType": "NetworkFolder",
"executionType": "Manual",
"executed": "1723553569099",
"executedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282"
}
],
"total": 1
}
Возвращает список всех процессов пакетной загрузки. Поддерживается только синхронный вызов.
- На входе: Search
- На выходе: Page[PackageImportProcess]
| Команда | Путь |
|---|---|
| packageImporter_ListPackageImportProcess | HTTP POST "/v1/packageImportProcess/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| executedBy | InSetQuery |
| sourceType | InSetQuery |
| executionType | InSetQuery |
| packageImportConfigId | InSetQuery |
| status | InSetQuery |
| executed | RangeQuery |
Доступные поля для сортировки:
| Поле |
|---|
| packageImportConfigId |
| status |
| executed |
| sourceType |
| executionType |
GetPackageImportProcess
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"packageImportConfigId": "some-config-id",
"status": "IN PROGRESS",
"config": {},
"info": {},
"sourceType": "NetworkFolder",
"executionType": "Manual",
"executed": "1723553569099",
"executedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282"
}
Поиск процесса пакетной загрузки с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: PackageImportProcessId (String)
- На выходе: PackageImportProcess
| Команда | Путь |
|---|---|
| packageImporter_GetPackageImportProcess | HTTP POST "/v1/packageImportProcess/get" |
DeletePackageImportProcess
Payload для команды
"some-id"
Результат выполнения команды
true
Удаляет процесс пакетной загрузки с заданным идентификатором. Также удаляет все записи в таблице файлов, связанные с этим процессом. И также удаляются все processedFilePath из s3 от записей в таблице файлов со статусом NotLocated. Отправляет событие об удалении процесса.
- На входе: PackageImportProcessId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| packageImporter_DeletePackageImportProcess | - |
ListPackageImportFile
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "status",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"packageImportProcessId": "some-process-id",
"fileName": "some.json",
"status": "IN PROGRESS",
"sourceFilePath": "folder/some.json",
"processedFilePath": "",
"info": {},
"executed": "1723553569099"
}
],
"total": 1
}
Возвращает список всех файлов пакетной загрузки. Поддерживается только синхронный вызов.
- На входе: Search
- На выходе: List[PackageImportFile]
| Команда | Путь |
|---|---|
| packageImporter_ListPackageImportFile | HTTP POST "/v1/packageImportFile/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| sourceFilePath | LikeQuery, InSetQuery |
| processedFilePath | InSetQuery |
| packageImportProcessId | InSetQuery |
| status | InSetQuery |
| fileName | LikeQuery, InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| packageImportProcessId |
| sourceFilePath |
| status |
| executed |
| fileName |
ListNotLocatedPackageImportFile
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "status",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
[
{
"fileName": "LKMN-0D33-RD-VNPR-WHPT-005-0040-FF-BOM-01168-01-AFU.json",
"sourceFilePath": "smb://10.168.22.228/Data/LKMN-0D33-RD-VNPR-WHPT-005-0040-FF-BOM-01168-01-AFU.json",
"journaledRows": [
{
"id": "82a20d47-e9e4-4baa-be4b-939ad55668af",
"packageImportProcessId": "76333294-e37a-4db9-aa4e-fe80db8fdb7c",
"status": "NOT LOCATED",
"processedFilePath": "package-importer-not-located\\036bf9b0-97fe-4fab-b878-1b2fc61dbe3c",
"info": {},
"executed": 1744880455236
},
{
"id": "73b6f35f-bbe5-4744-bafd-19a716200dde",
"packageImportProcessId": "79cc58e1-2e38-49be-915c-a19e894ebc46",
"status": "NOT LOCATED",
"processedFilePath": "package-importer-not-located\\7442c4be-e20c-4d70-a90f-e51dd839b295",
"info": {},
"executed": 1744887090266
}
]
}
]
Возвращает сгруппированный список файлов пакетной загрузки по полям fileName и sourceFilePath, у которых НЕТ И НЕ БЫЛО ДРУГОГО СТАТУСА кроме NOT LOCATED.
Наши варианты:
- Файл обрабатывался один раз и с первого раза попал в карточку. Запись в таблице у него одна и она в состоянии Success
- Файл обрабатывался много раз но до сих пор не попал в карточку. Записей в таблице у него несколько и они все NonLocated
- Файл обрабатывался много раз, и первые несколько раз ему не удалось подобрать карточку, но в последний раз удалось. У него несколько записей в таблице - несколько NonLocated и одна Success
Роут возвращает то, что описано во втором пункте.
Поддерживается только синхронный вызов.
- На входе: Search
- На выходе: PackageImportFileNotLocatedResponse
| Команда | Путь |
|---|---|
| packageImporter_ListNotLocatedPackageImportFile | HTTP POST "/v1/packageImportFile/listNotLocated" |
Доступные поля для фильтрации и виды фильтров по ним как в роуте ListPackageImportFile
Доступные поля для сортировки:
| Поле |
|---|
| sourceFilePath |
| fileName |
ReprocessPackageImportFile
Payload для команды
[
{
"fileName": "имя файла",
"sourceFilePath": "Источник файла",
"journaledIds": [
"uuid-asdfasdff",
"uuid-asdfasdff2",
"uuid-asdfasdff3"
]
}
]
Результат выполнения команды
{}
Дораспределяет файлы, которые находятся в статусе NOT LOCATED. Создает процессы до тех пор, пока есть нераспределенные файлы. Если команды выполняется синхронно, то она выполняется до тех пор пока не выполнится логика. Предполагается, что бужет использоваться как асинхронная команда через send/async.
Если файлы не в состоянии NOT LOCATED, выдаст ошибку, какие именно файлы не в нужном статусе.
После успешного распределения файлов предыдущие записи о файлах со статусами NOT LOCATED станут в статус SUCCESS LATER. Update происходит по полям fileName и processedFilePath.
ВАЖНО: при журналировании файлов процесса дораспределения в sourceFilePath пишется то, что мы получили в processedFilePath, потому что мы не загружаем еще раз в s3, а просто пытаемся перетащить из бакета not located в бакет temp, а потом выполняем команду datamodel.
- На входе: Seq[ProcessPackageImportFile]
- На выходе: Unit
| Команда | Путь |
|---|---|
| packageImporter_ReprocessPackageImportFiles | - |
ManualProcessPackageImportFile
Payload для команды
{
"processImportFile": {
"fileName": "имя файла",
"sourceFilePath": "Источник файла",
"journaledIds": [
"uuid-asdfasdff",
"uuid-asdfasdff2",
"uuid-asdfasdff3"
]
},
"target": {
"id": "uuid-targetid",
"entityType": "Document",
"fieldName": "documentFile"
}
}
Результат выполнения команды
{
"status": "SUCCESS",
"errorMessage": null
}
Команда должна обработать записи связанные с группой строк в таблице ProcessImportFile, выбрать из них последнюю запись, переложить файл ассоциированный с этой записью в бакет temp, обновить поле fieldName у объекта которого мы передали в качестве target - добавить в него метаданные распределяемого файла, обновить состояние всех записей о неудачном распределении файла - изменить его на SuccessLater, обновить info у всех записей о неудачном распределении файла (id из journaledIds) - добавить в него информацию о том что файл был распределен в карточку объекта target
Никакого процесса не создается, в рамках логики только обновление записей о файлах и процессах.
Работа происходит с journaledIds.
- если journaledIds пустой, вернется ошибка
- если в journaledIds 1 элемент, получаем инфу для распределения из него и апдейтим статус в SUCCESS/NOT LOCATED/ERROR. ERROR возможен только если файла нет в s3. NOT LOCATED - не смогли распределить. SUCCESS - updateObjectFields отработал корректно. Также записи с тем же sourceFilePath, filename и md5 отправляются в статус SUCCESS LATER, если запись обновилась со статусом SUCCESS - их мы получаем из базы данных.
- если в journaledIds больше 1 элемента, берем последнюю запись о файле с наибольшим executed, работаем с ним как в варианте с одним элементом, но переводим в SUCCESS LATER то что в journaledIds при успешном ручном распределении.
Важно: логика ручного распределения отличается от логики обычной пакетной загрузки, мы не создаем записи о файлах и процессах, а также получаем другие статусы в ситуациях для файла.
- На входе: ManualProcessPackageImportFileDto
- На выходе: ManualProcessPackageImportFileResponse
| Команда | Путь |
|---|---|
| packageImporter_ManualProcessPackageImportFile | - |
GetPackageImportFile
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"packageImportProcessId": "some-process-id",
"fileName": "some.json",
"status": "IN PROGRESS",
"sourceFilePath": "folder/some.json",
"processedFilePath": "",
"info": {},
"executed": "1723553569099"
}
Поиск файла пакетной загрузки с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: PackageImportFileId (String)
- На выходе: PackageImportFile
| Команда | Путь |
|---|---|
| packageImporter_GetPackageImportFile | HTTP POST "/v1/packageImportFile/get" |
DeletePackageImportFile
Payload для команды
"some-id"
Результат выполнения команды
true
Удаление файла пакетной загрузки с заданным идентификатором. Если файл со статусом NOT LOCATED, пройзойдет попытка удаления файла из s3 по тому пути, который описан в processedFilePath. Если нет пути - не удалит, но удалит из бд. Поддерживается только синхронный вызов.
- На входе: PackageImportFileId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| packageImporter_DeletePackageImportFile |
DeletePackageImportFileSearch
Payload для команды
{
"query": "",
"context": {},
"sorting": null,
"paging": null
}
Результат выполнения команды
true
Удаление файлов пакетной загрузки с заданным идентификатором. Аналогичное удаление как и в DeletePackageImportFile, но передается Search вместо id. Возможна ошибка EntityNotFound, если нет таких файлов в бд. Поля sort и paging при удалении не учитываются. Поддерживается только синхронный вызов.
- На входе: Search
- На выходе: Boolean
| Команда | Путь |
|---|---|
| packageImporter_DeletePackageImportFileSearch |
ExecutePackageImport
Payload для команды
"some-config-id"
Результат выполнения команды
"some-process-id"
Запуск процесса пакетной загрузки в бекграунде и возвращение id запущенного процесса.
Процесс загружает файлы, найденные в папке networkFolders, в destinationFields.fieldName - поле, куда добавляем файлы. Информация для процесса берется из поля info PackageImportConfig.
Файлы должны быть с названием в виде {шифр}{постфикс}.{расширение}. По расширению также можно отфильтровать в info конфига, чтобы импортились с определенным расширением.
Процесс импорта может завершиться 3 статусами. Вначале ему присваивается статус IN PROGRESS. После импорта - SUCCESS ( если хотя бы один файл загружен), ERROR (если ошибка загрузки или ошибка доступа к папкам).
У каждого файла следующие статусы: вначале присвается IN PROGRESS, завершается SUCCESS - если все ок, ERROR - если не вышло загрузить, NOT LOCATED - если загрузили в бакет not-located.
Поддерживается только синхронный вызов.
- На входе: PackageImportConfigId (String)
- На выходе: PackageImportProcessId (String)
| Команда | Путь |
|---|---|
| packageImporter_ExecutePackageImport | HTTP POST "/v1/packageImport/execute" |
ExecuteLocalPackageImport
Payload для команды
{
"configId": "a44296bc-f09c-4248-b279-061f8f363356",
"files": [
{
"fileName": "LKMN-0D33-RD-VNPR-WHPT-005-0040-FF-BOM-01168-01-AFU.json",
"url": "temp/10126f32-5b6a-418b-98ea-9d5e55ec65bb",
"fileId": "10126f32-5b6a-418b-98ea-9d5e55ec65bb"
}
]
}
Результат выполнения команды
"some-process-id"
Команда с аналогичной логикой как в ExecutePackageImport. Разница лишь в том, что файлы берутся не из папки, а из payload, предполагая что они уже скачаны в s3.
Также запускается процесс в бекграунде и как можно быстрее возвращаем processId.
Поддерживается только синхронный вызов.
- На входе: ExecuteLocalPackageImportDto
- На выходе: PackageImportProcessId (String)
| Команда | Путь |
|---|---|
| packageImporter_ExecuteLocalPackageImport | HTTP POST "/v1/packageImport/executeLocal" |
CheckNetworkFolder
Payload для команды
{
"networkFolder": "smb://192.168.1.99/networkFolder/",
"user": "user",
"password": "password"
}
Результат выполнения команды
{
"result": "SUCCESS",
"errorMessage": null
}
Роут для проверки сетевой папки. Возвращает boolean - результат проверки, папка ли это. Поддерживается только синхронный вызов.
В networkFolder может быть либо виндовый UNC-путь (тогда user и password не используются), либо путь через протокол smb, где user и password - credentials для профиля подключенного по сети пк. Можно расшарить папку и дать все доступы, тогда credentials для smb не будут нужны.
Примеры путей:
smb -> "smb://192.168.1.99//networkFolder/"
unc -> "\\192.168.1.99\networkFolder"
Варианты ответов:
SUCCESS - мы подключаемся к папке
AUTH - неверный логин пароль подключения
TIMEOUT - таймаут выполения подключения к папке (5 секунд)
PATH - неверный путь (либо мы смогли подключиться, но это не папка)
FAILURE - все остальные падения
Во всех случаях статус ответа - 200
- На входе: CheckNetworkFolderDto
- На выходе: CheckNetworkFolderResponse
| Команда | Путь |
|---|---|
| packageImporter_CheckNetworkFolder | HTTP POST "/v1/packageImport/checkNetworkFolder" |
ClearProjectData
Payload для команды
{
"context": "d33"
}
Останавливаются все крон процессы от конфигов с указанным контекстом, процессы со статусом IN PROGRESS. После удаляются - файлы, процессы, конфиги. Также чистится папка temp, куда скачиваются файлы (перед удалением).
- На входе: ClearProjectDataDto
- На выходе: Unit
| Команда | Путь |
|---|---|
| packageImporter_ClearProjectData | HTTP POST "/v1/packageImport/clearProjectData" |
Модели сервиса package-importer
PackageImportConfig
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ProjectConfigId (String) | Да | Уникальный идентификатор - строковый код |
| title | String | Да | Наименование шаблона |
| description | String | Нет | Описание |
| config | jsonb PackageImportConfigModel | Да | Конфигурация пакетной загрузки |
| context | CommandContext (String) | Нет | Идентификатор проекта |
| created | Long | Да | Время создания |
| createdBy | UserId (UUID) | Да | Uuid пользователя создавшего запись |
| modified | Long | Да | Время изменения |
| modifiedBy | UserId (UUID) | Да | Uuid пользователя изменившего запись |
| version | Int | Да | Версия для оптимистической блокировки |
PackageImportConfigModel
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| networkFolders | Seq[Folder] | Нет | Информация о сетевых папках, откуда берем файлы |
| cronSettings | CronSettings | Нет | Настройки крон процессинга |
| extensionFilter | String | Нет | Какие расширения мы пытаемся взять из networkFolder (через запятую) |
| destinations | PackageImportDestinations | Да | Информация о том, куда мы загрузим файлы |
Folder
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| path | String | Да | Путь к сетевой папке |
| user | String | Нет | Имя пользователя для подключения к удаленному пк |
| password | String | Нет | Пароль для подключения к удаленному пк |
CronSettings
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| cronStart | Long | Нет | Начало крон процессинга |
| cronEnd | Long | Нет | Конец крон процессинга (позже этого времени не будет процесса) |
| cronConfig | String | Да | Крон, с которым работает библиотека quartz |
| timezone | String | Нет | Таймзона в формате GMT (это кастомный формат, если написать неправильно или не GMT, крон не запустится) |
PackageImportDestinations
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | (EntityTypeId) String | Да | Тип сущности, по объектам которого ищем шифр |
| searchField | String | Да | Поле объекта entityType, в котором ищем шифр |
| destinationFields | Seq[PackageImportDestinationField] | Да | Места, куда пытаемся добавить найденный файл |
PackageImportConfigCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| title | String | Да | Наименование шаблона |
| description | String | Нет | Описание |
| config | jsonb | Да | Конфигурация пакетной загрузки |
PackageImportConfigUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ProjectConfigId (String) | Да | Уникальный идентификатор - строковый код |
| title | String | Да | Наименование шаблона |
| description | String | Нет | Описание |
| config | jsonb | Да | Конфигурация пакетной загрузки |
| version | Int | Да | Индекс оптимистической блокировки |
ExecuteLocalPackageImportDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| configId | ProjectConfigId (String) | Да | Ид конфига пакетной загрузки |
| files | Seq[LocalPackageImportFile] | Да | Уже загруженные в бакет tmp файлы |
LocalPackageImportFile
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileId | String | Да | Id файла в s3 |
| url | String | Да | Полный путь к файлу в s3 |
| fileName | String | Да | Имя файла с расширением |
CheckNetworkFolderDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| networkFolder | String | Да | Полный путь до сетевой папки |
| user | String | Нет | Имя пользователя для доступа к сетевой папке |
| password | String | Нет | Пароль для доступа к сетевой папке |
| packageImportConfigId | String | Нет | Конфиг, из которого берем логин и пароль |
CheckNetworkFolderResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| result | CheckNetworkFolderString (String) | Да | Результат проверки доступа к сетевой папке и проверка на папку |
| errorMessage | String | Нет | Ошибка, если не смогли проверить доступность папки |
PackageImportFileNotLocatedInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileName | String | Да | Имя файла |
| sourceFilePath | String | Да | Источник файла |
| journaledRows | Seq[PackageImportFileGrouped] | Да | Список записей в таблице файлов, которые находятся в статусе NOT LOCATED |
PackageImportFileNotLocatedResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| items | Seq[PackageImportFileNotLocatedInfo] | Да | Список сгруппированных записей в таблице файлов, которые находятся в статусе NOT LOCATED |
| total | Int | Да | Количество сгруппированных записей в items |
PackageImportFileGrouped
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | PackageImportFileId (UUID) | Да | Уникальный идентификатор записи - автогенерируемый UUID |
| packageImportProcessId | PackageImportProcessId (UUID) | Да | Ссылка на процесс в котором происходит импорт файла |
| status | PackageImportProcessStatus (String) | Да | Состояние процесса импорта (IN PROGRESS, SUCCESS, ERROR) |
| processedFilePath | String | Нет | Полный путь до файла, после процессинга (в нашей S3) |
| info | JSON (Object) | Да | Дополнительная произвольняа метаинформация о том что случилось в процессе импорта файла (ссылки на документ, причины ошибок) |
| executed | Long | Нет | Дата изменения записи |
ProcessPackageImportFile
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fileName | String | Да | Имя файла |
| sourceFilePath | String | Да | Источник файла |
| journaledIds | Seq[PackageImportFileId (UUID)] | Да | Id файлов, которые хотим распределить и которые находятся в статусе NOT LOCATED |
ProcessTarget
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ObjectId (String) | Да | Ид объекта, в который добавим файлы |
| entityType | EntityTypeId (String) | Да | Таблица объекта |
| fieldName | FieldName (String) | Да | Поле для добавления файла |
ManualProcessPackageImportFileDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| processImportFile | ProcessPackageImportFile | Да | Информация о нераспределенных файлах |
| target | ProcessTarget | Да | Указание куда сохраним файлы |
ManualProcessPackageImportFileResponse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| status | String | Да | SUCCESS/ERROR |
| errorMessage | String | Нет | Сообщение о возможной ошибке |
PackageImportProcess
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | PackageImportProcessId (UUID) | Да | Уникальный идентификатор процесса |
| packageImportConfigId | PackageImportConfigId (UUID) | Да | Ссылка на конфиг по которому запущен процесс |
| status | PackageImportProcessStatus (String) | Да | Состояние процесса (IN PROGRESS, SUCCESS, ERROR) |
| config | JSON (Object) | Да | Конфигурация пакетной загрузки - сюда мы запоминаем содержимое конфига на момент старта |
| info | JSON (Object) PackageImportProcessInfo | Да | Дополнительная произвольняа метаинформация о процессе импорта |
| sourceType | SourceType (String) | Да | Источник запуска: LocalFiles, NetworkFolder |
| executionType | ExecutionType (String) | Да | Тип запуска: Manual, Automatic |
| executed | Long | Да | дата/время запуска импорта |
| executedBy | UserId (UUID) | Нет | ID пользователя изменившего запись |
PackageImportFile
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | PackageImportFileId (UUID) | Да | Уникальный идентификатор записи - автогенерируемый UUID |
| packageImportProcessId | PackageImportProcessId (UUID) | Да | Ссылка на процесс в котором происходит импорт файла |
| fileName | String | Да | Имя файла |
| status | PackageImportProcessStatus (String) | Да | Состояние процесса импорта (IN PROGRESS, SUCCESS, ERROR) |
| sourceFilePath | String | Да | Полный путь до файла, который мы загружаем (в исходной папке) |
| processedFilePath | String | Нет | Полный путь до файла, после процессинга (в нашей S3) |
| info | JSON (Object) PackageImportFileInfo | Да | Дополнительная произвольняа метаинформация о том что случилось в процессе импорта файла (ссылки на документ, причины ошибок) |
| executed | Long | Нет | Дата изменения записи |
PackageImportFileInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| errorCode | ErrorCode (String) | Нет | Код ошибки |
| errorMessage | String | Нет | Сообщение ошибки |
| errorStackTrace | String | Нет | Стектрейс ошибки |
| entityType | EntityTypeId (String) | Нет | Тип сущности |
| fieldName | String | Нет | Поле, в которое добавили файл |
| objectId | ObjectId (String) | Нет | Ид объекта, в который добавили файл |
| zipParent | String | Нет | Ссылка на запись обработки zip архива |
| possibleTargets | PossibleTarget array | Нет | Возможные варианты, куда можно записать файл (появляется при ситуации когда таких мест больше 1) |
PossibleTarget
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| objectId | ObjectId (String) | Да | Ид объекта, в который добавили файл |
| destination | PackageImportDestinationField | Да | Элемент из destinationFields из конфига |
| zipParent | String | Нет | Ссылка на запись обработки zip архива |
PackageImportDestinationField
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fieldName | FieldName (String) | Да | Имя поля для добавления |
| postfix | String | Нет | Постфикс из имени файла (Шифр_постфикс.расширение) |
PackageImportProcessInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| badNetworkFolders | String array | Нет | Список сетевых папок, к которым не смогли подключиться |
ClearProjectDataDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| context | String | Нет | Название проекта для удаления |
project-copy: сервис копирования проектов
Команды могут приходить как по HTTP, так и через Kafka в топик project_copy_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/projectcopy_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- PROJECT_COPY_DB_HOST
- PROJECT_COPY_DB_PORT
- PROJECT_COPY_DB_NAME
- PROJECT_COPY_DB_USER
- PROJECT_COPY_DB_PASSWORD
Запуск из консоли с помощью SBT
PROJECT_COPY_DB_HOST=localhost PROJECT_COPY_DB_PORT=5432 PROJECT_COPY_DB_NAME=projectcopy_db PROJECT_COPY_DB_USER=postgres PROJECT_COPY_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения сервиса project-copy
Все доступные переменные окружения для настройки сервиса.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| PROJECT_COPY_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| PROJECT_COPY_HTTP_PORT | int | нет | 8192 | Порт, на котором слушает HTTP-сервер |
| PROJECT_COPY_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| PROJECT_COPY_KAFKA_TOPIC | string | нет | "project_copy_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| PROJECT_COPY_KAFKA_CONSUMER_GROUP | string | нет | "project_copy_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| PROJECT_COPY_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| PROJECT_COPY_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| PROJECT_COPY_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| PROJECT_COPY_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| PROJECT_COPY_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах PROJECT_COPY_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| PROJECT_COPY_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который PROJECT_COPY_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| PROJECT_COPY_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| PROJECT_COPY_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| PROJECT_COPY_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| PROJECT_COPY_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. |
| PROJECT_COPY_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| PROJECT_COPY_KAFKA_AUTH_MODE | string | нет | "" | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| PROJECT_COPY_KAFKA_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig] |
| PROJECT_COPY_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| PROJECT_COPY_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| PROJECT_COPY_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL | duration string | нет | 4 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
| PROJECT_COPY_KAFKA_CONNECTION_CHECK_INTERVAL | duration string | нет | 60 seconds | Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
| PROJECT_COPY_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL | duration string | нет | 5 minutes | Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
| PROJECT_COPY_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| PROJECT_COPY_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| PROJECT_COPY_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| PROJECT_COPY_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| PROJECT_COPY_DISCOVERABLE_ID | string | нет | "another_PROJECT_COPY_service_instance" | ID сервиса в ServiceDiscovery |
| PROJECT_COPY_DISCOVERABLE_NAME | string | нет | "projectcopy" | Имя сервиса в ServiceDiscovery |
| PROJECT_COPY_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| PROJECT_COPY_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| PROJECT_COPY_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| PROJECT_COPY_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| PROJECT_COPY_SERVICE_TITLE | string | нет | "project-copy" | Название сервиса для отображения |
| PROJECT_COPY_SERVICE_DESCRIPTION | string | нет | "Service PROJECT_COPY" | Описание сервиса для отображения |
| PROJECT_COPY_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| PROJECT_COPY_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| PROJECT_COPY_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| PROJECT_COPY_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| PROJECT_COPY_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| PROJECT_COPY_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| PROJECT_COPY_DB_HOST | string | да | Хост БД | |
| PROJECT_COPY_DB_PORT | int | да | Порт БД | |
| PROJECT_COPY_DB_NAME | string | да | Имя базы в БД | |
| PROJECT_COPY_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| PROJECT_COPY_DB_USER | string | да | Пользователь БД | |
| PROJECT_COPY_DB_PASSWORD | string | да | Пароль пользователя БД | |
| PROJECT_COPY_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| PROJECT_COPY_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| PROJECT_COPY_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| PROJECT_COPY_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| PROJECT_COPY_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| PROJECT_COPY_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| PROJECT_COPY_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| PROJECT_COPY_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| PROJECT_COPY_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| PROJECT_COPY_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| PROJECT_COPY_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| PROJECT_COPY_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| PROJECT_COPY_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| PROJECT_COPY_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| PROJECT_COPY_DB_AUTO_COMMIT | boolean | нет | true | Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
| PROJECT_COPY_DB_SCHEMA | string | нет | "public" | Устанавливает schema по умолчанию |
| PROJECT_COPY_DB_ISOLATE_INTERNAL_QUERIES | boolean | нет | false | Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
| PROJECT_COPY_DB_INITIALIZATION_FAIL_TIMEOUT | int | нет | 1 | Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
| PROJECT_COPY_LOG_LEVEL | string | нет | INFO | Общий уровень логирования в сервисе |
| PROJECT_COPY_LOG_LEVEL_AKKA | string | нет | INFO | Уровень логирования для akka |
| PROJECT_COPY_LOG_LEVEL_LIQUIBASE | string | нет | INFO | Уровень логирования для liquibase (миграции) |
| PROJECT_COPY_LOG_LEVEL_APPLICATION | string | нет | DEBUG | Уровень логирования для application |
| PROJECT_COPY_LOG_LEVEL_SLICK_STATEMENT | string | нет | DEBUG | Уровень логирования запросов, отправляемых slick в БД |
| PROJECT_COPY_LOG_LEVEL_SLICK_BENCHMARK | string | нет | OFF | Уровень логирование бенчмарков выполнения запросов slick |
| PROJECT_COPY_LOG_LEVEL_KAFKA_PRODUCER | string | нет | WARN | Уровень логирования конфига kafka-producer |
| PROJECT_COPY_LOG_LEVEL_KAFKA_CONSUMER | string | нет | WARN | Уровень логирования конфига kafka-consumer |
| PROJECT_COPY_LOG_LEVEL_HTTP_SERVER | string | нет | WARN | Уровень логирования HTTP-сервера |
| PROJECT_COPY_LOG_LEVEL_AKKAHTTPSENDER | string | нет | TRACE | Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
| PROJECT_COPY_LOG_LEVEL_KAFKASENDER | string | нет | TRACE | Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
| PROJECT_COPY_LOG_LEVEL_COMMANDSTATUSCLI | string | нет | TRACE | Уровень логирования для проверки состояний команд в сервисе статусов |
| PROJECT_COPY_LOG_LEVEL_TEAM_ROUTES | string | нет | TRACE | Уровень логирования для роутов /team |
| PROJECT_COPY_LOG_OUTPUT | string | нет | STDOUT | Вывод лога |
| PROJECT_COPY_SYSLOG_TYPE | string | нет | UDP | Тип передачи syslog |
| PROJECT_COPY_LOGGING_SRC_IP | string | нет | для параметра src в логах | |
| PROJECT_COPY_LOGGING_SRC_HOST | string | нет | для параметра shost в логах | |
| PROJECT_COPY_LOGGING_DST_IP | string | нет | для параметра dst в логах | |
| PROJECT_COPY_LOGGING_CEF_VER | string | нет | 0 | версия CEF |
| PROJECT_COPY_PROCESSING_PARALLELISM | int | нет | 3 | Количество одновременно выполняемых шагов копирования |
| PROJECT_COPY_SINGLE_STEP_PROCESSING_PARALLELISM | int | нет | 1 | Количество одновременно выполняемых запросов в рамках одного шага копирования |
| PROJECT_COPY_PROCESSING_SNAPSHOT_PARALLELISM | int | нет | 10 | Количество одновременно выполняемых запросов при вычислении снапшота |
| PROJECT_COPY_PROCESSING_PAGE_SIZE | int | нет | 1000 | Размер страницы при копировании данных списков |
| PROJECT_COPY_FORM_PROCESSING_PAGE_SIZE | int | нет | 100 | Размер страницы при копировании данных форм |
| PROJECT_COPY_RESTART_ON_TIMEOUT_COUNT | int | нет | 3 | Количество попыток при падении команды по таймауту |
| PROJECT_COPY_CREATE_RELATION_BATCH_SIZE | int | нет | 20 | Размер страницы при создании relation |
| PROJECT_COPY_DIFF_CACHE_TTL | duration string | нет | 10 minutes | Время жизни снапшот кэша |
Список команд сервиса project-copy
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
В сервисе реализованы команды:
GetSnapshot
Возвращает снапшот проекта, указанного в X-Context
Payload для команды
{
"projectFrom": null,
"projectTo": "project1",
"mode": "FirstCopy",
"useCache": true
}
Результат выполнения команды
{
"entries": [
{
"collectionType": "entities",
"collectionCode": "PI",
"title": "Предварительное извещение",
"newItemCount": 1,
"existingItemCount": 0,
"required": [
{
"collectionType": "catalogs",
"collectionCode": "mechanismCatalog"
}
],
"dependent": []
},
{
"collectionType": "entitiesData",
"collectionCode": "PI",
"title": "Предварительное извещение",
"newItemCount": 25,
"existingItemCount": 10,
"required": [
{
"collectionType": "entities",
"collectionCode": "PI"
}
],
"dependent": [
{
"collectionType": "numerationRules",
"collectionCode": "2cf81fee-3fe9-45e9-9580-8aabf7d5f357"
}
]
}
],
"relations": [
{
"entity1": "documentTest",
"entity2": "systemTest",
"field1": "fromDocumentToSystem",
"field2": "fromSystemToDocument",
"title1": "Система документа",
"title2": "Документы Системы"
}
]
}
- Input: SnapshotInput
- Output: SnapshotInfo
| Команда | Путь |
|---|---|
| projectcopy_GetSnapshot | - |
ListRepeatCopyItems
Возвращает список элементов в коллекции снапшота (diff)
Payload для команды
{
"projectFrom": null,
"projectTo": "project1",
"collectionType": "catalogs",
"collectionCode": "TagTypes",
"query": "запрос",
"paging": {
"page": 1,
"count": 100
},
"useCache": true
}
Результат выполнения команды
{
"items": [
{
"id": "6cbb80c9-2a7c-44a0-80d5-1188c9e68bbf",
"alreadyExists": true,
"title": "ООО \"Волгограднефтепроект\"",
"data": {},
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "f88ac136-d422-49bd-bc2b-c9aff2250675"
}
]
}
],
"total": 1
}
- Input: SnapshotItemsInput
- Output: Page[SnapshotItem]
| Команда | Путь |
|---|---|
| projectcopy_ListRepeatCopyItems | HTTP POST "/v1/snapshot/items" |
CreateAndRunPlan
Создает и запускает процесс копирования проекта
Payload для команды
{
"projectFrom": null,
"projectTo": "project1",
"useCache": true,
"entries": [
{
"collectionType": "entities",
"collectionCode": "entityWithAllFields"
},
{
"collectionType": "generationRuleSets",
"ids": ["e2d22a87-0d3f-43e8-a25a-fa5380e3be77"],
"negation": false
}
]
}
Результат выполнения команды
"865b7ec2-b6f8-4a71-89fe-fbfa041360f8"
Команда возвращает ID созданного процесса
- Input: RepeatCopyPlanCreateDTO
- Output: UUID
| Команда | Путь |
|---|---|
| projectcopy_CreateAndRunPlan | - |
CreateAndRunPlanFull
Создает и запускает полный процесс копирования проекта
Payload для команды
{
"projectFrom": null,
"projectTo": "project1",
"useCache": true,
"clearProject": true
}
Результат выполнения команды
"865b7ec2-b6f8-4a71-89fe-fbfa041360f8"
Команда возвращает ID созданного процесса
- Input: FullPlanCreateDTO
- Output: UUID
| Команда | Путь |
|---|---|
| projectcopy_CreateAndRunPlanFull | - |
CreateSyncPlans
Создает планы синхронизации для проектов
Payload для команды
{
"projectFrom": null,
"projectTo": ["project1", "project2"],
"useCache": true
}
Результат выполнения команды
[
"865b7ec2-b6f8-4a71-89fe-fbfa041360f8",
"865b7ec2-b6f8-4a71-89fe-fbfa041360f8"
]
Команда возвращает список ID созданных процессов
- Input: SyncPlansCreateDTO
- Output: UUID[]
| Команда | Путь |
|---|---|
| projectcopy_CreateSyncPlans | - |
RestartSyncProcess
Перезапускает существующий план синхронизации
Payload для команды
"865b7ec2-b6f8-4a71-89fe-fbfa041360f8"
Команда не возвращает данных
- Input: UUID
- Output: Нет
| Команда | Путь |
|---|---|
| projectcopy_RestartSyncProcess | - |
IsProjectEmpty
Возвращает boolean - пуст указанный проект или нет
Payload для команды
"project1"
Результат выполнения команды
true
- Input: String
- Output: Boolean
| Команда | Путь |
|---|---|
| projectcopy_IsProjectEmpty | - |
GetCopyProcess
Получить процесс копирования по id
Payload для команды
"92b0e49f-94e8-4e2c-bbf1-abf2d1b033a6"
Результат выполнения команды
{
"id": "92b0e49f-94e8-4e2c-bbf1-abf2d1b033a6",
"authorId": "00000000-0000-0000-0000-000000000000",
"projectFrom": null,
"projectTo": "project1",
"created": 1745395890701,
"finished": 1745395890701,
"status": "FinishedWithErrors",
"approved": 1745395890701,
"approvedBy": "00000000-0000-0000-0000-000000000000",
"mode": "Sync"
}
- Input: UUID
- Output: CopyProcess
| Команда | Путь |
|---|---|
| projectcopy_GetCopyProcess | - |
ListCopyProcesses
Получить список процессов копирования
Payload для команды
{
"query": "",
"context": {}
}
Результат выполнения команды
{
"items": [
{
"id": "d3c5f8f8-308f-4789-97a4-26744011924d",
"authorId": "00000000-0000-0000-0000-000000000000",
"projectFrom": null,
"projectTo": "project1",
"created": 1745395890701,
"finished": 1745395890701,
"status": "FinishedWithErrors",
"approved": 1745395890701,
"approvedBy": "00000000-0000-0000-0000-000000000000",
"mode": "Sync"
}
],
"total": 1
}
- Input: Search
- Output: Page[CopyProcess]
| Команда | Путь |
|---|---|
| projectcopy_ListCopyProcesses | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| authorId | InSetQuery |
| projectFrom | InSetQuery |
| projectTo | InSetQuery |
| created | RangeQuery |
| finished | InSetQuery, RangeQuery |
| status | InSetQuery |
| approved | InSetQuery, RangeQuery |
| approvedBy | InSetQuery |
| mode | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| id |
| authorId |
| projectFrom |
| projectTo |
| created |
| finished |
| status |
| approved |
| approvedBy |
| mode |
ListCopyProcessSteps
Получить список шагов процессов копирования
Payload для команды
{
"query": "",
"context": {}
}
Результат выполнения команды
{
"items": [
{
"id": "0eaa1ec1-b3f5-4211-8db8-bf3ed07c56f7",
"title": "Проект",
"processId": "d3c5f8f8-308f-4789-97a4-26744011924d",
"collectionType": "catalogs",
"collectionCode": "Project",
"ids": [
"0ff64714-ee16-462f-acc7-f268aafea9cc"
],
"negation": false,
"dependencies": [
"0ff64714-ee16-462f-acc7-f268aafea9cc"
],
"created": 1745395890701,
"started": 1745395890701,
"finished": 1745395893307,
"status": "FinishedWithErrors",
"error": "Some error",
"additionalInfo": null
},
{
"id": "0ff64714-ee16-462f-acc7-f268aafea9cc",
"title": "Права на подраздел \"Права доступа\" раздела \"Управление\"",
"processId": "d3c5f8f8-308f-4789-97a4-26744011924d",
"collectionType": "policies",
"collectionCode": "default_Control-Authorization",
"ids": [
"0ff64714-ee16-462f-acc7-f268aafea9cc"
],
"negation": false,
"dependencies": [],
"created": 1745395890701,
"started": 1745395890701,
"finished": 1745395893615,
"status": "FinishedSuccessfully",
"error": null,
"additionalInfo": {
"some": "data"
}
}
],
"total": 2
}
- Input: Search
- Output: Page[CopyProcessStep]
| Команда | Путь |
|---|---|
| projectcopy_ListCopyProcessSteps | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| title | InSetQuery, LikeQuery, TsQuery |
| processId | InSetQuery |
| collectionType | InSetQuery |
| collectionCode | InSetQuery |
| created | RangeQuery |
| started | InSetQuery, RangeQuery |
| finished | InSetQuery, RangeQuery |
| status | InSetQuery |
| error | InSetQuery, LikeQuery, TsQuery |
| additionalInfo | InSetQuery, LikeQuery, TsQuery |
Доступные поля для сортировки:
| Поле |
|---|
| id |
| title |
| processId |
| collectionType |
| collectionCode |
| created |
| started |
| finished |
| status |
| error |
| additionalInfo |
ProcessDiffs
Принять или отклонить шаги синхронизации
Payload для команды
{
"processId": "48cbdadf-1803-4227-89a9-3e48d9cf152c",
"approveDiffs": ["cd02eb6b-ea39-4ef6-ae34-e69668a11ba7"],
"approveEntities": ["Document"],
"rejectDiffs": ["cd02eb6b-ea39-4ef6-ae34-e69668a11ba7"],
"rejectEntities": ["Document"],
"execute": true
}
Команда не возвращает данных
- Input: ProcessStepsInput
- Output: Нет
| Команда | Путь |
|---|---|
| projectcopy_ProcessDiffs | - |
ListCollectionLinks
Получить список связей коллекций
Payload для команды
{
"project": "project1",
"collectionType": "entities",
"collectionCodes": ["Documents_0D33"]
}
Результат выполнения команды
[
{
"collectionCode": "Documents_0D33",
"links": [
{
"collectionCode": "Documents_0D33",
"project": "project2"
}
]
}
]
- Input: ListCollectionLinksInput
- Output: CollectionLinkList[]
| Команда | Путь |
|---|---|
| projectcopy_ListCollectionLinks | - |
ListCollectionItemLinks
Получить список связей элементов коллекции
Payload для команды
{
"project": "project1",
"collectionType": "entities",
"collectionCode": "Documents_0D33",
"ids": ["dafe9254-577a-3232-a9a7-f0095d4821b7"]
}
Результат выполнения команды
[
{
"id": "dafe9254-577a-3232-a9a7-f0095d4821b7",
"links": [
{
"id": "3b7a4d36-d3b2-4834-9b8f-7fac3b7a7f82",
"project": "project2"
}
]
}
]
- Input: ListCollectionItemLinksInput
- Output: CollectionItemLinkList[]
| Команда | Путь |
|---|---|
| projectcopy_ListCollectionItemLinks | - |
MapEntity
Трансформировать сущность межпроектными связями
Payload для команды
{
"collectionType": "generationRuleSets",
"data": {}
}
Результат выполнения команды
{
"data": {},
"warning": false
}
- Input: MapEntityInput
- Output: MapEntityOutput
| Команда | Путь |
|---|---|
| projectcopy_MapEntity | - |
SearchLinkedEntities
Поиск по связанным сущностям datamodel
Payload для команды
{
"project": "d44",
"entityTypeId": "Documents",
"search": {
"query": "data.code",
"context": {
"data.code": "DDD"
}
}
}
Результат выполнения команды
[
"dafe9254-577a-3232-a9a7-f0095d4821b7",
"3b7a4d36-d3b2-4834-9b8f-7fac3b7a7f82"
]
- Input: SearchLinkedEntitiesInput
- Output: UUID[]
| Команда | Путь |
|---|---|
| projectcopy_SearchLinkedEntities | - |
ListSyncModelItems
Получить список изменений модели для синхронизации
Payload для команды
{
"processId": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"entityTypeId": "TagTypes",
"search": {
"query": "",
"context": {}
}
}
Результат выполнения команды
{
"modelChanges": [
{
"id": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"status": "Approved",
"diffType": "Title",
"before": "Тип тега 1",
"after": "Тип тега 2",
"previouslyRejected": false,
"syncErrors": [],
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "483fe285-61ab-4d44-bfa6-6d09fecbb620"
}
]
}
],
"newFields": [
{
"id": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"status": "Approved",
"fieldId": "NewField1",
"fieldType": "string",
"title": "sometitle",
"description": null,
"nullable": null,
"settings": {
"multiple": false,
"maxLength": 64
},
"previouslyRejected": false,
"syncErrors": ["None"],
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "483fe285-61ab-4d44-bfa6-6d09fecbb620"
}
]
}
],
"fieldChanges": [
{
"fieldId": "code",
"title": "Код типа тега 1",
"diffs": [
{
"id": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"status": "Approved",
"diffType": "Title",
"before": "Код типа тега 1",
"after": "Код типа тега 2",
"previouslyRejected": false,
"syncErrors": ["None"],
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "483fe285-61ab-4d44-bfa6-6d09fecbb620"
}
]
}
]
}
],
"newRelations": [
{
"id": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"status": "Approved",
"relationType": "many-to-one",
"entity1": "TagTypes",
"entity2": "system",
"entity1Title": "Тэги",
"entity2Title": "Системы",
"entity1Field": "tagType1",
"entity2Field": null,
"entity1FieldTitle": "Связь с системами",
"entity2FieldTitle": null,
"entity1Settings": { "maxItems": 10 },
"entity2Settings": {},
"entity1FieldDependenciesInvalid": [false],
"entity2FieldDependenciesInvalid": [],
"dependencies1Text": [
{
"fieldEntityType": "текст",
"dependentFieldCode": "текст",
"dependentEntityTypeRelationFieldCode": "текст"
}
],
"dependencies2Text": [],
"previouslyRejected": false,
"syncErrors": ["None"],
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "483fe285-61ab-4d44-bfa6-6d09fecbb620"
}
]
}
],
"relationChanges": [
{
"entity1": "TagTypes",
"entity2": "system",
"entity1Title": "Тэги",
"entity2Title": "Системы",
"entity1Field": "tagType1",
"entity2Field": null,
"entity1FieldTitle": "Связь с системами",
"entity2FieldTitle": null,
"diffs": [
{
"id": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"status": "Approved",
"diffType": "Title",
"before": "Имя 1",
"after": "Имя 2",
"previouslyRejected": false,
"syncErrors": [],
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "483fe285-61ab-4d44-bfa6-6d09fecbb620"
}
]
}
]
}
]
}
- Input: ListSyncObjectItemsInput
- Output: ListSyncModelItemResult
| Команда | Путь |
|---|---|
| projectcopy_ListSyncModelItems | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| diffType | InSetQuery |
| stepId | InSetQuery |
| status | InSetQuery |
| previouslyRejected | InSetQuery |
ListSyncModelCatalogItems
Получить список изменений модели каталога для синхронизации
Payload для команды
{
"processId": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"catalogCode": "TagTypes",
"search": {
"query": "",
"context": {}
}
}
Результат выполнения команды
[
{
"id": "73051afa-69aa-4094-a2b4-3a8ebda1d496",
"status": "Approved",
"diffType": "Title",
"before": "Проект новое",
"after": "Проект новое 1",
"previouslyRejected": false,
"syncErrors": []
}
]
- Input: ListSyncCatalogItemsInput
- Output: CatalogModelChange[]
| Команда | Путь |
|---|---|
| projectcopy_ListSyncModelCatalogItems | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| diffType | InSetQuery |
| stepId | InSetQuery |
| status | InSetQuery |
| previouslyRejected | InSetQuery |
ListSyncObjectItems
Получить список изменений объектов для синхронизации
Payload для команды
{
"processId": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"entityTypeId": "TagTypes",
"search": {
"query": "",
"context": {}
}
}
Результат выполнения команды
{
"items": [
{
"id": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"field": "LKMNDocType",
"fieldType": "relation",
"fieldName": "Тип документа по справочнику заказчика",
"objectId": "227ef8fe-c2cf-4fad-8009-c7ae3685ce67",
"objectTitle": "Схема принципиальная расчетная",
"status": "Approved",
"before": "7ed5626d-924d-4444-990a-2e6ff8af2b9f",
"beforeText": [
"Запрос"
],
"after": "750661ee-8a86-44f3-9986-0596d364c3e3",
"afterText": [
"Запрос 1"
],
"syncValueExistsInTargetProject": true,
"objectDiffType": "Relation",
"previouslyRejected": false,
"syncErrors": ["None"]
}
],
"total": 1
}
- Input: ListSyncObjectItemsInput
- Output: Page[ObjectDiff]
| Команда | Путь |
|---|---|
| projectcopy_ListSyncObjectItems | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| diffType | InSetQuery |
| stepId | InSetQuery |
| status | InSetQuery |
| previouslyRejected | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| id |
| diffType |
| stepId |
| status |
| previouslyRejected |
| index |
ListSyncCatalogItems
Получить список изменений элементов каталога для синхронизации
Payload для команды
{
"processId": "79324f23-09ae-4bff-84de-d62b1da4aec1",
"catalogCode": "TagTypes",
"search": {
"query": "",
"context": {}
}
}
Результат выполнения команды
{
"items": [
{
"id": "372e63e4-8c16-4691-be17-64ef7e59ccf8",
"catalogItemId": "c2d7044c-9391-44fb-9a1d-39e08bc4a0e7",
"status": "Approved",
"diffType": "Title",
"before": "Месторождение Корчагина 1",
"after": "Месторождение Корчагина 122",
"previouslyRejected": false,
"syncErrors": []
}
],
"total": 1
}
- Input: ListSyncCatalogItemsInput
- Output: Page[CatalogItemDiff]
| Команда | Путь |
|---|---|
| projectcopy_ListSyncCatalogItems | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| diffType | InSetQuery |
| stepId | InSetQuery |
| status | InSetQuery |
| previouslyRejected | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| id |
| diffType |
| stepId |
| status |
| previouslyRejected |
| index |
GetSyncItemsSummary
Получить статистику по синхронизируемым сущностям
На вход - id процесса
"93879d67-0536-4d53-af0f-ac44eb189521"
Результат выполнения команды
[
{
"collectionType": "entitiesData",
"collectionCode": "Mark",
"title": "Марка",
"approvedItemCount": 1,
"rejectedItemCount": 1,
"modelChangesCount": 1,
"objectChangesCount": 1,
"anySyncErrors": false,
"allSyncErrors": false,
"allPreviouslyRejected": false,
"required": [],
"dependent": [
{
"collectionType": "entitiesData",
"collectionCode": "Documents",
"id": "483fe285-61ab-4d44-bfa6-6d09fecbb620"
}
]
}
]
- Input: UUID
- Output: Page[EntityDiffSummary]
| Команда | Путь |
|---|---|
| projectcopy_GetSyncItemsSummary | - |
Модели сервиса project-copy
RepeatCopyPlanCreateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| projectFrom | string | нет | ID проекта, из которого произойдет копирование |
| projectTo | string | да | ID проекта, в который произойдет копирование |
| useCache | boolean | нет | Использовать кэшированные данные (по-умолчанию true) |
| entries | CollectionSearch[] | да | Очистить проект перед копированием |
FullPlanCreateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| projectFrom | string | нет | Проект из которого будет копирование |
| projectTo | string | да | Проект в который будет копирование |
| useCache | boolean | нет | Использовать кэшированные данные (по-умолчанию true) |
| clearProject | boolean | да | Очистить проект перед копированием |
SyncPlansCreateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| projectFrom | string | нет | Проект из которого будет синхронизация |
| projectTo | string | да | Проект в который будет синхронизация |
| useCache | boolean | нет | Использовать кэшированные данные (по-умолчанию true) |
CollectionSearch
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | String | да | Подтип коллекции (например, код сущности datamodel) |
| ids | String[] | нет | Список ID элементов коллекции |
| negation | Boolean | нет | Копировать все кроме указанных ID |
SnapshotInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| projectFrom | string | нет | Проект из которого будет копирование |
| projectTo | string | нет | Проект в который будет копирование. Если указан null - то предполагается копирование в пустой проект |
| mode | ModeEnum | нет | Режим копирования |
| useCache | boolean | нет | Использовать кэшированные данные (по-умолчанию true) |
SnapshotItemsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| projectFrom | string | нет | Проект из которого будет копирование |
| projectTo | string | нет | Проект в который будет копирование. Если указан null - то предполагается копирование в пустой проект |
| query | string | нет | Поисковый запрос для элементов |
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | string | да | Подтип коллекции (например, код сущности datamodel) |
| paging | Paging | нет | Пагинация для списка |
| useCache | boolean | нет | Использовать кэшированные данные (по-умолчанию true) |
SnapshotItem
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID объекта |
| alreadyExists | boolean | да | Существует ли элемент в целевом проекте |
| title | string | да | Название объекта |
| data | json object | да | Дополнительные параметры объекта |
| required | SnapshotItemDependency[]] | да | Объекты, от которых зависит этот |
| dependent | SnapshotItemDependency[]] | да | Объекты, которые зависят от этого |
SnapshotInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entries | SnapshotEntityInfo[]] | да | Информация о типах сущностей в сервисе Datamodel |
| relations | SnapshotRelationInfo[]] | да | Список отношений сущностей Datamodel |
SnapshotEntityInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | String | да | Подтип коллекции (например, код сущности datamodel) |
| title | String | да | Название сущности |
| newItemCount | Int | нет | Количество новых элементов в коллекции |
| existingItemCount | Int | нет | Количество существующих элементов в коллекции |
| required | SnapshotDependency[]] | да | Сущности, от которых зависит эта |
| dependent | SnapshotDependency[]] | да | Сущности, которые зависят от этой |
SnapshotRelationInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entity1 | String | да | Код сущности 1 |
| entity2 | String | да | Код сущности 2 |
| field1 | String | да | Код поля в сущности 1 |
| field2 | String | нет | Код поля в сущности 2 |
| title1 | String | да | Наименование поля для сущности 1 |
| title2 | String | нет | Наименование поля для сущности 2 |
SnapshotDependency
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | String | да | Подтип коллекции (например, код сущности datamodel) |
SnapshotItemDependency
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | String | да | Подтип коллекции (например, код сущности datamodel) |
| id | String | да | ID объекта |
CopyProcess
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | да | ID процесса |
| authorId | UUID | нет | ID пользователя, запустившего процесс |
| projectFrom | String | нет | ID проекта, из которого копировали данные |
| projectTo | String | нет | ID проекта, в который копировали данные |
| created | TimeStamp | да | Дата создания (начала) процесса |
| finished | TimeStamp | нет | Дата окончания процесса |
| status | String | да | Статус процесса |
| approved | TimeStamp | нет | Дата принятия изменений |
| approvedBy | UUID | нет | ID пользователя, принявшего изменения |
| mode | ModeEnum | нет | Режим копирования |
Возможные значения status:
- Preparing - Подготовка (просчет snapshot)
- PreparationFailed - Ошибка подготовки
- NoChanges - Изменения для этого процесса отсутствуют
- PendingApproval - Ожидает подтверждения всех шагов пользователем
- InProgress - В процессе
- FinishedSuccessfully - Завершен успешно
- FinishedWithErrors - Завершен с ошибками
- Cancelled - Отменен
- NonActual - Неактуально т.к был создан новый план синхронизации.
- NoAvailableChanges - Изменения недоступны
CopyProcessStep
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | да | ID шага процесса |
| title | String | да | Наименование шага |
| processId | UUID | да | ID процесса |
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | String | да | Подтип коллекции (например, код сущности datamodel) |
| ids | String[] | да | ID элементов коллекции |
| negation | Boolean | да | Все кроме указанных id |
| dependencies | UUID[] | да | ID шагов-предшественников |
| created | TimeStamp | да | Дата создания шага |
| started | TimeStamp | нет | Дата начала выполнения шага |
| finished | TimeStamp | нет | Дата окончания выполнения шага |
| status | String | да | Статус шага |
| error | String | нет | Сообщение об ошибке |
Возможные значения status:
- PendingApproval - Ожидает подтверждения пользователем
- WaitingForDependencies - Ожидает выполнения шагов-предшественников
- WaitingForExecution - Ожидает очереди выполнения
- InProgress - В процессе
- FinishedSuccessfully - Завершен успешно
- FinishedWithErrors - Завершен c ошибкой
- Cancelled - Отменен
- NonActual - Неактуально т.к был создан новый план синхронизации.
- PreviousFailed - Не запущен т.к. предыдущие шаги выполнены с ошибкой
- NoAvailableChanges - Изменения недоступны
SetIgnoredInputEntry
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | string | да | Подтип коллекции (например, код сущности datamodel) |
| ids | string[] | да | ID элементов коллекции |
| negation | boolean | да | Выставить всем кроме указанных id |
ProcessStepsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| processId | uuid | да | ID процесса копирования |
| approveDiffs | uuid[] | да | ID изменений для подтверждения |
| approveEntities | string[] | да | ID сущностей для подтверждения |
| rejectDiffs | uuid[] | да | ID изменений для отклонения |
| rejectEntities | string[] | да | ID сущностей для отклонения |
| execute | boolean | да | Применить изменений |
ListCollectionLinksInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| project | string | нет | Код проекта |
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCodes | string[] | да | Коды коллекций |
CollectionLinkList
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionCode | string | да | Код коллекции |
| links | CollectionLinkListItem | да | Связи с другими проектами |
CollectionLinkListItem
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionCode | string | да | Код коллекции |
| project | string | нет | Код проекта |
ListCollectionItemLinksInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| project | string | нет | Код проекта |
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| collectionCode | string | да | Код коллекции |
| ids | string[] | да | ID элементов коллекции |
MapEntityInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции (например, сущность datamodel) |
| data | json | да | json для трансформации |
Типы data для разных collectionType:
- generationRuleSets - GenerationRuleSet (vnp-control)
- numerationRules - NumerationRule (vnp-control)
- entityClasses - EntityClass (classification)
- hierarchies - HierarchyEntity (vnp-control)
- для остальных - трансформация не происходит, можно передавать любой json
MapEntityOutput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| data | json | да | трансформированный json |
| warning | boolean | да | были ли убраны части json из-за отсутствия связей |
SearchLinkedEntitiesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| project | string | нет | Код проекта |
| entityTypeId | string | да | Код сущности |
| search | Search | да | Параметры поиска (только фильтрация) |
ListSyncObjectItemsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| processId | uuid | да | ID процесса |
| entityTypeId | string | да | Код сущности |
| search | Search | да | Параметры поиска |
ListSyncCatalogItemsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| processId | uuid | да | ID процесса |
| catalogCode | string | да | Код каталога |
| search | Search | да | Параметры поиска |
CatalogItemDiff
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| catalogItemId | uuid | да | ID элемента каталога |
| status | DiffStatusEnum | да | Статус изменения |
| diffType | string | да | Тип изменения |
| before | string | да | Старое значение |
| after | string | да | Новое значение |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
Возможные значения diffType:
- Title - название элемента
ObjectDiff
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| field | string | да | Код поля |
| fieldType | string | да | Тип поля |
| fieldName | string | да | Название поля |
| objectId | string | да | ID объекта |
| objectTitle | string | да | Название объекта |
| status | DiffStatusEnum | да | Статус изменения |
| before | json | да | Старое значение |
| beforeText | string[] | да | Старое текстовое значение |
| after | json | да | Новое значение |
| afterText | string[] | да | Новое текстовое значение |
| syncValueExistsInTargetProject | boolean | да | Существует ли значение в целевом проекте |
| objectDiffType | string | да | Тип поля |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
Возможные значения objectDiffType:
- Field - обычное поле
- Relation - отношение
CatalogModelChange
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| status | DiffStatusEnum | да | Статус изменения |
| diffType | string | да | Тип изменения |
| before | json | да | Предыдущее значение |
| after | json | да | Новое значение |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
Возможные значения diffType:
- Title - изменение названия каталога
ListSyncModelItemResult
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| modelChanges | ModelChange[] | да | Изменения модели |
| newFields | NewFieldChange[] | да | Новые поля |
| fieldChanges | FieldChange[] | да | Изменения полей |
| newRelations | NewRelationChange[] | да | Новые relation |
| relationChanges | RelationChange[] | да | Изменения relation |
ModelChange
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| status | DiffStatusEnum | да | Статус изменения |
| diffType | string | да | Тип изменения |
| before | json | да | Предыдущее значение |
| after | json | да | Новое значение |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
| required | SyncDependency | да | Необходимые изменения |
| dependent | SyncDependency | да | Зависящие от этого изменения |
Возможные значения diffType:
- Title - изменение названия сущности
Тип before/after - String
- Description - изменение описания сущности
Тип before/after - String
- TitleRule - изменение настройки titleRule
Тип before/after - String
- Revision - изменение настройки ревизии
Тип before/after - RevisionDiffValue
RevisionDiffValue
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| actualityFieldTitle | string | нет | Поле актуальности |
| parentFieldTitle | string | нет | Поле родительской сущности |
NewFieldChange
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| status | DiffStatusEnum | да | Статус изменения |
| fieldId | string | да | Код поля |
| fieldType | string | да | Тип поля |
| title | string | да | Название поля |
| description | string | нет | Описание поля |
| nullable | boolean | нет | Обязательность поля |
| settings | FieldSettings | нет | Настройки поля |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
| required | SyncDependency | да | Необходимые изменения |
| dependent | SyncDependency | да | Зависящие от этого изменения |
FieldSettings
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| multiple | boolean | нет | Множественное значение |
| maxCount | int | нет | Максимальное количество значений |
| maxLength | int | нет | Максимальная длина строки |
| code | string | нет | Код каталога |
FieldChange
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fieldId | string | да | Код поля |
| title | string | да | Название поля |
| diffs | FieldDiff | да | Изменения поля |
FieldDiff
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| status | DiffStatusEnum | да | Статус изменения |
| diffType | string | да | Тип изменения |
| before | json | да | Предыдущее значение |
| after | json | да | Новое значение |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
| required | SyncDependency | да | Необходимые изменения |
| dependent | SyncDependency | да | Зависящие от этого изменения |
Возможные значения diffType:
- Title - изменение названия поля
- Description - изменение описания поля
- Nullable - изменение обязательности поля
- SettingsMultiple - изменение настройки множественности
- SettingsMaxCount - изменение настройки максимального количества значений
- SettingsMaxLength - изменение настройки максимальной длины поля
- SettingsCatalogCode - изменение настройки кода каталога
NewRelationChange
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| status | DiffStatusEnum | да | Статус изменения |
| relationType | string | да | Тип отношения |
| entity1 | string | да | Тип сущности слева |
| entity2 | string | да | Тип сущности справа |
| entity1Title | string | да | Название сущности слева |
| entity2Title | string | да | Название сущности справа |
| entity1Field | string | да | Код поля сущности слева |
| entity2Field | string | нет | Код поля сущности справа |
| entity1FieldTitle | string | да | Описание relation слева |
| entity2FieldTitle | string | нет | Описание relation справа |
| entity1Settings | RelationSettings | нет | Настройки сущности слева |
| entity2Settings | RelationSettings | нет | Настройки сущности справа |
| entity1FieldDependenciesInvalid | boolean[] | да | Ошибки копирования зависимых полей слева |
| entity2FieldDependenciesInvalid | boolean[] | да | Ошибки копирования зависимых полей справа |
| dependencies1Text | DependencyDiffValue[] | да | Читаемые настройки зависимых полей справа |
| dependencies2Text | DependencyDiffValue[] | да | Читаемые настройки зависимых полей слева |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
| required | SyncDependency | да | Необходимые изменения |
| dependent | SyncDependency | да | Зависящие от этого изменения |
RelationSettings
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| maxItems | uuid | нет | Максимальное количество связей |
RelationChange
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entity1 | string | да | Тип сущности слева |
| entity2 | string | да | Тип сущности справа |
| entity1Title | string | да | Название сущности слева |
| entity2Title | string | да | Название сущности справа |
| entity1Field | string | да | Код поля сущности слева |
| entity2Field | string | нет | Код поля сущности справа |
| entity1FieldTitle | string | да | Описание relation слева |
| entity2FieldTitle | string | нет | Описание relation справа |
| diffs | RelationDiff | нет | Изменения relation |
RelationDiff
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | uuid | да | ID изменения |
| status | DiffStatusEnum | да | Статус изменения |
| diffType | string | да | Тип изменения |
| before | json | да | Предыдущее значение |
| after | json | да | Новое значение |
| previouslyRejected | boolean | да | Ранее отклоненное изменение |
| syncErrors | SyncErrorEnum[] | да | Ошибки синхронизации |
| required | SyncDependency | да | Необходимые изменения |
| dependent | SyncDependency | да | Зависящие от этого изменения |
Возможные значения diffType:
- Title - изменение названия relation
- MaxItems - изменение настройки максимального количества связей
Тип before/after - Int
- Dependency - изменение/добавление/удаление зависимого поля
Тип before/after - DependencyDiffValue
SyncDependency
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции |
| collectionCode | string | да | Код коллекции |
| id | uuid | да | ID изменения |
DependencyDiffValue
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fieldTitle | String | нет | Управляющее поле |
| dependentFieldTitle | String | нет | Зависимое поле |
| dependentEntityTypeRelationFieldTitle | String | нет | Источник связи между полями |
EntityDiffSummary
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| collectionType | CollectionTypeEnum | да | Тип коллекции |
| collectionCode | string | да | Код коллекции |
| title | string | нет | Название коллекции |
| approvedItemCount | int | да | Количество принятых изменений |
| rejectedItemCount | int | да | Количество отклоненных изменений |
| modelChangesCount | int | да | Количество изменений модели |
| objectChangesCount | int | да | Количество изменений объектов |
| anySyncErrors | boolean | да | Есть ли ошибки синхронизации |
| allSyncErrors | boolean | да | Все элементы блока - ошибки синхронизации |
| allPreviouslyRejected | boolean | да | Все элементы блока были отклонены ранее |
| required | SyncDependency | да | Необходимые изменения |
| dependent | SyncDependency | да | Зависящие от этого изменения |
CollectionItemLinkList
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID объекта |
| links | CollectionItemLinkListItem | да | Связи с другими проектами |
CollectionItemLinkListItem
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID объекта |
| project | string | нет | Код проекта |
CollectionTypeEnum:
Возможные значения:
- entities - Cущности datamodel
- entitiesData - Данные сущностей datamodel
- userGroups - Группы пользователей
- policies - Политики
- indexations - Правила индексации
- catalogEntity - Каталоги
- catalogs - Элементы каталогов
- forms - Формы ui-storage
- entityClasses - Классы сущностей
- exportTemplates - Шаблоны экспорта
- hierarchies - Иерархии
- generationRuleSets - Правила генерации документа
- valueGenerationRulesTitle - Правила формирования значения поля сущности (title)
- valueGenerationRulesCipher - Правила формирования значения поля сущности (cipher)
- numerationRules - Правила нумерации
- ftsMappings - Правила индексации в full-text-search (маппинги)
- relations - Отношения datamodel
ModeEnum:
Возможные значения:
- FirstCopy - Первое копирование в пустой проект
- RepeatCopy - Докопирование новых объектов
- Sync - Синхронизация существующих объектов
DiffStatusEnum
Возможные значения:
- Approved - принято
- Rejected - отклонено
SyncErrorEnum
Возможные значения:
- CatalogItemMissing - Отсутствует элемент каталога
- CatalogMissing - Отсутствует каталог
- EntityObjectMissing - Отсутствует объект
- EntityMissing - Отсутствует сущность
- None - Без ошибки
Statistics: сервис статистики
Сервис принимает запросы для работы с игроками и командами. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик statistics_commands.
Информация по добавлению команд можно прочитать в описании шаблона
Конфигурирование statistics
Требования к запуску statistics
Запуск из консоли с помощью SBT
STATISTICS_DB_HOST=localhost
STATISTICS_DB_PORT=5432
STATISTICS_DB_NAME=statistics_db
STATISTICS_DB_USER=postgres
STATISTICS_DB_PASSWORD=12345
sbt boot/run
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/statistics_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - В Consul будет добавлен адрес Kafka по ключу
kafka_bootstrap_serverили адрес будет указан вapplication.conf - Добавлены необходимые переменные окружения:
STATISTICS_DB_HOSTSTATISTICS_DB_PORTSTATISTICS_DB_NAMESTATISTICS_DB_USERSTATISTICS_DB_PASSWORD
Список переменных окружения сервиса statistics
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
STATISTICS_HTTP_HOST |
string | Нет | 0.0.0.0 |
Хост, на котором слушает HTTP-сервер |
STATISTICS_HTTP_PORT |
int | Нет | 8653 |
Порт, на котором слушает HTTP-сервер |
STATISTICS_KAFKA_SERVERS |
string | Да | localhost:9092 |
Адрес Kafka |
STATISTICS_KAFKA_TOPIC |
string | Нет | statistics_commands |
Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
STATISTICS_KAFKA_CONSUMER_GROUP |
string | Нет | statistics_consumer_group |
Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
STATISTICS_KAFKA_PARTITIONS |
int | Нет | 10 |
Число читаемых партиций из кафка-топика команд. |
STATISTICS_KAFKA_CONSUMER_RESTART_MIN_BACKOFF |
duration string | Нет | 1 second |
Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
STATISTICS_KAFKA_CONSUMER_RESTART_MAX_BACKOFF |
duration string | Нет | 30 seconds |
Максимальное задержка до рестарта консьюмера после падения |
STATISTICS_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR |
double | Нет | 0.2 |
Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
STATISTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS |
int | Нет | 5 |
Максимальное число рестартов консьюмера после падения (в пределах STATISTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
STATISTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN |
duration string | Нет | 5 minutes |
Временной отрезок, в который STATISTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
STATISTICS_KAFKA_COMMANDEVENT_TOPIC |
string | Да | commandevents |
Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
STATISTICS_KAFKA_AUTH_USER |
string | Нет | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. | |
STATISTICS_KAFKA_AUTH_PASSWORD |
string | Нет | Пароль учетной записи Kafka. | |
STATISTICS_KAFKA_AUTH_PRINCIPAL |
string | Нет | Принципал (идентификатор) пользователя kerberos | |
STATISTICS_KAFKA_AUTH_KEYTAB_PATH |
string | Нет | Путь к keytab-файлу kerberos | |
STATISTICS_KAFKA_AUTH_TRUSTSTORE_LOCATION |
string | Нет | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет. | |
STATISTICS_KAFKA_AUTH_TRUSTSTORE_PASSWORD |
string | Нет | Пароль к хранилищу сертификатов. | |
STATISTICS_KAFKA_AUTH_MODE |
string | Нет | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса | |
STATISTICS_KAFKA_AUTH_CONFIG |
string | Нет | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig] | |
STATISTICS_KAFKA_AUTH_CACHE_SIZE |
int | Нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
STATISTICS_KAFKA_AUTH_CACHE_TTL |
duration string | Нет | Время жизни Kafka producer в кеше. | |
STATISTICS_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL |
duration string | Нет | 4 minutes |
Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом. |
STATISTICS_KAFKA_CONNECTION_CHECK_INTERVAL |
duration string | Нет | 60 seconds |
Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений. |
STATISTICS_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL |
duration string | Нет | 5 minutes |
Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным. |
STATISTICS_FS_URI |
string | да | http://localhost:9000/ | Адрес файлового хранилища |
STATISTICS_FS_ACCESS_KEY_ID |
string | да | admin | Имя пользователя файлового хранилища |
STATISTICS_FS_SECRET_ACCESS_KEY |
string | да | admin | Пароль пользователя файлового хранилища |
STATISTICS_FS_UPLOAD_PARALLELISM |
int | нет | 4 | Параллелизм для загрузки файлов |
STATISTICS_FS_AUTH_MODE |
string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
STATISTICS_FS_AUTH_CONFIG |
string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep |
STATISTICS_FS_CACHE_SIZE |
int | нет | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). | |
STATISTICS_FS_CACHE_TTL |
duration string | нет | Время жизни клиента в кеше | |
STATISTICS_CONSUL_ADDR |
url string | Нет | http://localhost:8500 |
Адрес Сonsul. |
STATISTICS_CONSUL_AUTH_USER |
string | Нет | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. | |
STATISTICS_CONSUL_AUTH_PASSWORD |
string | Нет | Пароль учетной записи Сonsul. | |
STATISTICS_TRACE_DURATION |
boolean | Нет | false |
Признак необходимости трассировки выполнения команд |
STATISTICS_DISCOVERABLE_ID |
string | Нет | another_statistics_instance |
ID сервиса в ServiceDiscovery |
STATISTICS_DISCOVERABLE_NAME |
string | Нет | statistics |
Имя сервиса в ServiceDiscovery |
STATISTICS_DISCOVERABLE_HOST |
string | Да | localhost |
Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
STATISTICS_DISCOVERABLE_PORT |
int | Нет | 8192 |
Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. |
STATISTICS_DISCOVERABLE_LIVETIME |
duration string | Нет | 2 minutes |
Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
STATISTICS_DISCOVERABLE_HEALTHPASS |
string | Нет | 1 minute |
Периодичность отправки health check в ServiceDiscovery |
STATISTICS_SERVICE_NAME |
string | Нет | statistics |
Название сервиса для отображения |
STATISTICS_SERVICE_DESCRIPTION |
string | Нет | Service STATISTICS |
Описание сервиса для отображения |
STATISTICS_AKKA_HTTP_CLIENT_MAXCON |
int | Нет | 512 |
Максимальное число одновременных исходящих HTTP-соединений |
STATISTICS_AKKA_HTTP_CLIENT_MAXREQ |
int | Нет | 1024 |
Максимальное число одновременных исходящих HTTP-запросов |
STATISTICS_AKKA_HTTP_SERVER_MAXCON |
int | Нет | 1024 |
Максимальное число одновременных входящих HTTP-соединений |
STATISTICS_INTERNALCMD_ALLOW |
bool | Нет | true |
Можно ли сервису отправлять внутрисистемные команды |
STATISTICS_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD |
duration string | Нет | 10 minutes |
Время кэширования данных по командам из CommandDiscovery |
STATISTICS_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD |
duration string | Нет | 30 seconds |
Время кэширования данных по сервисам из ServiceDiscovery |
STATISTICS_DB_HOST |
string | Да | Хост БД | |
STATISTICS_DB_PORT |
int | Да | Порт БД | |
STATISTICS_DB_NAME |
string | Да | Имя базы в БД | |
STATISTICS_DB_URL |
jdbc url string | Нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
STATISTICS_DB_USER |
string | Да | Пользователь БД | |
STATISTICS_DB_PASSWORD |
string | Да | Пароль пользователя БД | |
STATISTICS_DB_THREADS |
int | Нет | 10 |
Количество потоков в пуле потоков для соединения с БД |
STATISTICS_DB_QUEUE_SIZE |
int | Нет | 300 |
Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
STATISTICS_DB_CONN_MAX |
int | Нет | 10 |
Максимальное количество одновременных подключений к БД |
STATISTICS_DB_CONN_TIMEOUT |
duration string | Нет | 20 second |
Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
STATISTICS_DB_ISOLATION |
string | Нет | READ_COMMITTED |
Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
STATISTICS_DB_READONLY |
boolean | Нет | false |
Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
STATISTICS_DB_CONN_MIN |
int | Нет | ${STATISTICS_DB_THREADS} |
Минимальное количество одновременных подключений к БД |
STATISTICS_DB_VALIDATION_TIMEOUT |
duration string | Нет | 1 seconds |
Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
STATISTICS_DB_IDLE_TIMEOUT |
duration string | Нет | 10 minutes |
Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
STATISTICS_DB_MAX_LIFETIME |
duration string | Нет | 30 minutes |
Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
STATISTICS_DB_INITIALIZATION_FAIL_FAST |
string | Нет | false |
Deprecated, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
STATISTICS_DB_LEAK_DETECTION_THRESHOLD |
int | Нет | 0 |
Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
STATISTICS_DB_CONNECTION_TEST_QUERY |
string | Нет | SELECT 1 |
Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
STATISTICS_DB_REGISTER_MBEANS |
boolean | Нет | false |
Зарегистрированы ли JMX Management Beans («MBeans») |
STATISTICS_DB_AUTO_COMMIT |
boolean | Нет | true |
Это свойство определяет то, как будут вести себя по умолчанию возвращаемые соединения относительно autocommit-а. |
STATISTICS_DB_SCHEMA |
string | Нет | public |
Устанавливает schema по умолчанию |
STATISTICS_DB_ISOLATE_INTERNAL_QUERIES |
boolean | Нет | false |
Определяет то, изолируются ли с помощью транзакций внутренние запросы пула(например запрос connection alive test). Свойство применяется только если autoCommit выключен. |
STATISTICS_DB_INITIALIZATION_FAIL_TIMEOUT |
int | Нет | 1 |
Работает, начиная с версии Slick 3.3.0. Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Любое положительное число считается числом миллисекунд для попытки получить начальное соединение;поток приложения будет заблокирован в течение этого периода. Если соединение не может быть получено до истечения этого времени,будет брошено исключение. Данный таймаут применяется после периода connectionTimeout. Если значение равно нулю (0),HikariCP попытается получить и проверить подключение. Если соединение получено,но проверка не пройдена, будет брошено исключение, и пул не будет запущен. Однако,если соединение не может быть получено, пул запустится,но последующие попытки получить соединение могут потерпеть неудачу.Значение меньше нуля пройдет любую первоначальную попытку подключения, и пул немедленно запустится,пытаясь получить соединения в фоновом режиме.Следовательно, последующие попытки получить соединение могут потерпеть неудачу. |
STATISTICS_LOG_LEVEL |
string | Нет | INFO |
Общий уровень логирования в сервисе |
STATISTICS_LOG_LEVEL_AKKA |
string | Нет | INFO |
Уровень логирования для akka |
STATISTICS_LOG_LEVEL_LIQUIBASE |
string | Нет | INFO |
Уровень логирования для liquibase (миграции) |
STATISTICS_LOG_LEVEL_APPLICATION |
string | Нет | DEBUG |
Уровень логирования для application |
STATISTICS_LOG_LEVEL_SLICK_STATEMENT |
string | Нет | DEBUG |
Уровень логирования запросов, отправляемых slick в БД |
STATISTICS_LOG_LEVEL_SLICK_BENCHMARK |
string | Нет | OFF |
Уровень логирование бенчмарков выполнения запросов slick |
STATISTICS_LOG_LEVEL_KAFKA_PRODUCER |
string | Нет | WARN |
Уровень логирования конфига kafka-producer |
STATISTICS_LOG_LEVEL_KAFKA_CONSUMER |
string | Нет | WARN |
Уровень логирования конфига kafka-consumer |
STATISTICS_LOG_LEVEL_HTTP_SERVER |
string | Нет | WARN |
Уровень логирования HTTP-сервера |
STATISTICS_LOG_LEVEL_AKKAHTTPSENDER |
string | Нет | TRACE |
Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена |
STATISTICS_LOG_LEVEL_KAFKASENDER |
string | Нет | TRACE |
Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена |
STATISTICS_LOG_LEVEL_COMMANDSTATUSCLI |
string | Нет | TRACE |
Уровень логирования для проверки состояний команд в сервисе статусов |
STATISTICS_LOG_LEVEL_TEAM_ROUTES |
string | Нет | TRACE |
Уровень логирования для роутов /team |
STATISTICS_LOG_OUTPUT |
string | Нет | STDOUT |
Вывод лога |
STATISTICS_SYSLOG_TYPE |
string | Нет | UDP |
Тип передачи syslog |
STATISTICS_LOGGING_SRC_IP |
string | Нет | для параметра src в логах | |
STATISTICS_LOGGING_SRC_HOST |
string | Нет | для параметра shost в логах | |
STATISTICS_LOGGING_DST_IP |
string | Нет | для параметра dst в логах | |
STATISTICS_LOGGING_CEF_VER |
string | Нет | 0 |
версия CEF |
STATISTICS_JOURNAL_MODE |
string | Нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
STATISTICS_JOURNAL_TOPIC |
string | Нет | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
|
STATISTICS_TABLE_STATISTICS_PARALLELISM |
int | Нет | 3 |
Количество одновременно расчитываемых графиков при расчете сводной таблицы |
STATISTICS_TABLE_STATISTICS_MAX_TREE_NODES |
int | Нет | 1000000 |
Максимальное количество вершин дерева (строк) сводной таблицы |
STATISTICS_TABLE_STATISTICS_MAX_AGGR_REQUESTS |
int | Нет | 1000 |
Максимальное количество запросов к datamodel при расчете одной сводной таблицы |
STATISTICS_TABLE_STATISTICS_MAX_AGGR_REQUESTS_SPREADSHEET |
int | Нет | 100000 |
Максимальное количество запросов к datamodel при расчете одной сводной таблицы (при скачивании .xslx) |
STATISTICS_TABLE_STATISTICS_CACHE_TTL |
duration string | Нет | 1 hour |
TTL результата расчета сводной таблицы в кэше |
STATISTICS_TABLE_STATISTICS_PROCESSING_CACHE_TTL |
duration string | Нет | 1 minute |
TTL результата расчета сводной таблицы в кэше (для одновременных запросов) |
STATISTICS_TABLE_STATISTICS_EXPORT_BUCKET |
string | Нет | export |
Бакет для результатов экспорта статистики |
Команды сервиса statistics
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
Не все поля EntityType доступны для использования в настройке авторизации.
Если указан прочерк "-", то данное значение не влияет на авторизацию:
- если не указан Action, то никакой Action не проверяется (= без авторизации)
- если не указан EntityType, то на авторизацию влияет только Action
| Назначение команды | Имя вызова команды | EntityType | Actions |
|---|---|---|---|
| Создание шаблона статистики | statistics_CreateStatisticsTemplate | Statistics |
CreateStatisticsTemplate |
| Обновление шаблона статистики | statistics_UpdateStatisticsTemplate | Statistics |
UpdateStatisticsTemplate |
| Удаление шаблона статистики | statistics_DeleteStatisticsTemplate | Statistics |
DeleteStatisticsTemplate |
| Получение шаблона статистики | statistics_GetStatisticsTemplate | Statistics |
ViewStatisticsTemplate |
| Список шаблонов статистики | statistics_ListStatisticsTemplates | Statistics |
ViewStatisticsTemplate |
| Расчет статистики | statistics_CalculateChartStatistics | Statistics |
CalculateChartStatistics |
| Расчет сводной таблицы | statistics_CalculateTableStatistics | Statistics |
CalculateTableStatistics |
| Выгрузка сводной таблицы | statistics_DownloadTableStatistics | Statistics |
DownloadTableStatistics |
CreateStatisticsTemplate
На входе параметры шаблона
{
"title": "Название шаблона",
"description": "Описание шаблона",
"config": {
"some": "config"
}
}
На выходе ID шаблона
"5304f635-b591-4868-9a3d-7bb582a7e990"
Создает новый шаблон статистики
Имя вызова команды: statistics_CreateStatisticsTemplate.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: StatisticsTemplateCreateDTO
- На выходе: UUID
UpdateStatisticsTemplate
На входе параметры шаблона
{
"id": "5304f635-b591-4868-9a3d-7bb582a7e990",
"title": "Название шаблона",
"description": "Описание шаблона",
"config": {
"some": "config"
}
}
Команда не возвращает данных
Обновляет шаблон статистики
Имя вызова команды: statistics_UpdateStatisticsTemplate.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: StatisticsTemplateUpdateDTO
- На выходе: UUID
DeleteStatisticsTemplate
На входе ID шаблона
"5304f635-b591-4868-9a3d-7bb582a7e990"
Команда не возвращает данных
Удаляет шаблон статистики
Имя вызова команды: statistics_DeleteStatisticsTemplate.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: UUID
- На выходе: Нет
GetStatisticsTemplate
На входе ID шаблона
"5304f635-b591-4868-9a3d-7bb582a7e990"
На выходе шаблон
{
"id": "5304f635-b591-4868-9a3d-7bb582a7e990",
"title": "new",
"description": "new",
"config": {
"some": 1
},
"created": 1756975661831,
"createdBy": "00000000-0000-0000-0000-000000000000",
"modified": 1756975661831,
"modifiedBy": "00000000-0000-0000-0000-000000000000",
"context": null
}
Возвращает шаблон статистики
Имя вызова команды: statistics_GetStatisticsTemplate.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: UUID
- На выходе: StatisticsTemplate
ListStatisticsTemplates
На входе параметры поиска
{
"query": "",
"context": {}
}
На выходе список шаблонов
{
"items": [
{
"id": "5304f635-b591-4868-9a3d-7bb582a7e990",
"title": "new",
"description": "new",
"config": {
"some": 1
},
"created": 1756975661831,
"createdBy": "00000000-0000-0000-0000-000000000000",
"modified": 1756975661831,
"modifiedBy": "00000000-0000-0000-0000-000000000000",
"context": null
}
],
"total": 1
}
Возвращает шаблон статистики
Имя вызова команды: statistics_GetStatisticsTemplates.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: UUID
- На выходе: Page[StatisticsTemplate]
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| title | InSetQuery, TsQuery, LikeQuery |
| description | InSetQuery, TsQuery, LikeQuery |
| created | RangeQuery |
| modified | RangeQuery |
| createdBy | InSetQuery |
| modifiedBy | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| id |
| title |
| description |
| created |
| createdBy |
| modified |
| modifiedBy |
CalculateChartStatistics
На входе параметры расчета
{
"charts": [
{
"code": "first",
"title": "Название шаблона",
"entityType": "Documents_0D33",
"filtering": {
"query": "",
"context": {}
},
"aggregation": {
"aggregationType": "Field",
"exactValue": "2234",
"optionsTitles": {
"successTitle": "success",
"failureTitle": "failure"
},
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
"dependencies": [
{
"parentChartCode": "second",
"parentAttributePath": [
{
"fieldCode": "ComplexToDocs",
"fieldType": "entityObject",
"entityType": "Complex_0D33"
}
]
}
]
},
{
"code": "second",
"title": "Название шаблона 2",
"entityType": "Complex_0D33",
"filtering": {
"query": "",
"context": {}
},
"aggregation": {
"aggregationType": "Field",
"exactValue": "6456",
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
"dependencies": []
}
],
"dependencyValues": [
{
"chartCode": "second",
"values": [
{
"value": "005",
"negation": true
}
]
}
]
}
На выходе статистика
[
{
"chartCode": "first",
"aggregationResult": [
{
"value": "123435",
"valueText": "123435",
"negation": false,
"count": 1,
"search": {
"query": "code",
"context": {
"code": "123435"
}
}
},
{
"value": null,
"valueText": "Не задано",
"negation": false,
"count": 1,
"search": {
"query": "",
"context": {}
}
}
]
},
{
"chartCode": "second",
"aggregationResult": [
{
"value": "005",
"valueText": "005",
"negation": false,
"count": 1,
"search": {
"query": "",
"context": {}
}
}
]
}
]
Возвращает статистику по указанному шаблону
Имя вызова команды: statistics_CalculateChartStatistics.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: CalculateChartStatisticsInput
- На выходе: StatisticsChartResult[]
CalculateTableStatistics
На входе параметры расчета
{
"charts": [
{
"code": "first",
"title": "Название шаблона",
"entityType": "Documents_0D33",
"filtering": {
"query": "",
"context": {}
},
"aggregation": {
"aggregationType": "Field",
"exactValue": "2234",
"optionsTitles": {
"successTitle": "success",
"failureTitle": "failure"
},
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
"dependencies": [
{
"parentChartCode": "second",
"parentAttributePath": [
{
"fieldCode": "ComplexToDocs",
"fieldType": "entityObject",
"entityType": "Complex_0D33"
}
]
}
]
},
{
"code": "second",
"title": "Название шаблона 2",
"entityType": "Complex_0D33",
"filtering": {
"query": "",
"context": {}
},
"aggregation": {
"aggregationType": "Field",
"exactValue": "6456",
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
"dependencies": []
}
],
"search": {
"query": "",
"context": {},
"paging": {
"page": 1,
"count": 100
}
},
"useCache": true
}
На выходе сводная таблица
{
"tree": [
{
"chartCode": "second",
"value": "005",
"valueText": "005",
"negation": false,
"count": 1,
"search": {
"query": "",
"context": {}
},
"children": [
{
"chartCode": "first",
"value": "тестище2",
"valueText": "тестище2",
"negation": false,
"count": 2,
"search": {
"query": "",
"context": {}
},
"children": [
{
"chartCode": "zero",
"value": "ОЗ",
"valueText": "ОЗ",
"negation": false,
"count": 1,
"search": {
"query": "",
"context": {}
},
"children": []
}
]
},
{
"chartCode": "first",
"value": "123435",
"valueText": "123435",
"negation": false,
"count": 1,
"search": {
"query": "",
"context": {}
},
"children": [
{
"chartCode": "zero",
"value": "ОЗ",
"valueText": "ОЗ",
"negation": false,
"count": 1,
"search": {
"query": "",
"context": {}
},
"children": []
}
]
}
]
}
],
"limitReached": false
}
Возвращает сводную таблицу по указанному шаблону
Имя вызова команды: statistics_CalculateTableStatistics.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: CalculateTableStatisticsInput
- На выходе: StatisticsTableResult
Возможные значения businessError:
- TreeTooComplex - процесс расчета дерева не укладывается в заданные лимиты
DownloadTableStatistics
На входе параметры расчета
{
"charts": [
{
"code": "first",
"title": "Название шаблона",
"entityType": "Documents_0D33",
"filtering": {
"query": "",
"context": {}
},
"aggregation": {
"aggregationType": "Field",
"exactValue": "2234",
"optionsTitles": {
"successTitle": "success",
"failureTitle": "failure"
},
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
"dependencies": [
{
"parentChartCode": "second",
"parentAttributePath": [
{
"fieldCode": "ComplexToDocs",
"fieldType": "entityObject",
"entityType": "Complex_0D33"
}
]
}
]
},
{
"code": "second",
"title": "Название шаблона 2",
"entityType": "Complex_0D33",
"filtering": {
"query": "",
"context": {}
},
"aggregation": {
"aggregationType": "Field",
"exactValue": "6456",
"attributePath": [
{
"fieldCode": "code",
"fieldType": "string"
}
]
},
"dependencies": []
}
],
"useCache": true,
"fileName": "File.xslx"
}
На выходе файл выгрузки
{
"file": "export/737fa7ba-ebd9-47ad-932d-13dd3788723c",
"limitReached": false
}
Формирует выгрузку сводной таблицы по указанному шаблону
Имя вызова команды: statistics_DownloadTableStatistics.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: DownloadTableStatisticsInput
- На выходе: DownloadTableStatisticsOutput
Возможные значения businessError:
- TreeTooComplex - процесс расчета дерева не укладывается в заданные лимиты
Модели сервиса statistics
DownloadTableStatisticsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
charts |
StatisticsChart[] | Да | Список графиков |
fileName |
String | Нет | Имя возвращаемого файла |
useCache |
Boolean | Да | Использовать кэш |
DownloadTableStatisticsOutput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
file |
String | Да | URL файла |
limitReached |
Boolean | Да | Был ли выход за установленный лимит при генерации |
CalculateTableStatisticsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
charts |
StatisticsChart[] | Да | Список графиков |
search |
Search | Нет | Параметры поиска (поддерживается только пагинация) |
useCache |
Boolean | Да | Использовать кэш |
StatisticsTableResult
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
tree |
StatisticsTableTree[] | Да | Дерево статистики |
limitReached |
Boolean | Да | Был ли выход за установленный лимит при генерации |
StatisticsTableTree
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
chartCode |
String | Да | Код графика |
value |
Json | Нет | Значение поля |
valueText |
String | Да | Читаемое значение поля |
negation |
Boolean | Да | Признак отрицания значения |
count |
Int | Да | Количество объектов по значению |
search |
Search | Да | Фильтры для запроса списка объектов |
children |
StatisticsTableTree[] | Да | Дочерние элементы дерева |
CalculateChartStatisticsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
charts |
StatisticsChart[] | Да | Список графиков |
dependencyValues |
ChartDependencyValue[] | Да | Выбранные значения в графиках |
StatisticsChart
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
code |
String | Да | Код графика |
title |
String | Да | Название графика |
entityType |
String | Да | Код сущности |
filtering |
Search | Нет | Фильтры сущности |
aggregation |
StatisticsChartAggregation | Да | Параметры агрегации |
dependencies |
StatisticsChartDependency[] | Да | Зависимости от других графиков |
StatisticsChartAggregation
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
aggregationType |
String | Да | Тип агрегации |
exactValue |
Json | Нет | Значение для агрегации по конкретному значению |
optionsTitles |
StatisticsChartOptionsTitles | Нет | Текстовые значения для агрегации по конкретному значению |
attributePath |
StatisticsAttributePath[] | Да | Путь до поля |
Возможные значения aggregationType:
- Field - Агрегация по полю
- ExistsValue - Агрегация по тому, заполнено ли поле
- HasExactValue - Агрегация по конкретному значению поля
StatisticsChartOptionsTitles
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
successTitle |
String | Да | Текстовое значение для существующего/указанного значения |
failureTitle |
String | Да | Текстовое значение для несуществующего/другого значения |
StatisticsAttributePath
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
fieldCode |
String | Да | Код поля |
fieldType |
String | Да | Тип поля |
entityType |
String | Нет | Код сущности (для fieldType=entityObject) |
catalogCode |
String | Нет | Код каталога (для fieldType=catalogItem) |
Возможные значения fieldType:
- string, uuid, number, file - обычные поля сущности
- entityObject - поле связи с другой сущностью
- catalogItem - поле каталог
ChartDependencyValue
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
chartCode |
String | Да | Код графика |
values |
ChartDependencySingleValue | Да | Выбранные значения |
ChartDependencySingleValue
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
value |
Json | Да | Выбранное значение |
negation |
Boolean | Да | Признак отрицания значения |
StatisticsChartDependency
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
parentChartCode |
String | Да | Код родительского графика |
parentAttributePath |
StatisticsAttributePath[] | Да | Путь до сущности родительского графика |
StatisticsChartResult
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
value |
Json | Нет | Значение поля |
valueText |
String | Да | Читаемое значение поля |
negation |
Boolean | Да | Признак отрицания значения |
count |
Int | Да | Количество объектов по значению |
search |
Search | Да | Фильтры для запроса списка объектов |
Возможные значения valueText:
- Для элементов каталога - название элемента
- Для связей с другими объектами - название объекта
- Для null - строка "Не определено"
- Для bool - строки "Да", "Нет"
- Для строк и чисел - то же самое, что и в самом поле value
StatisticsTemplateCreateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
title |
string | Да | Название шаблона |
description |
string | Нет | Описание шаблона |
config |
json | Да | Настройки шаблона |
StatisticsTemplateUpdateDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
uuid | Да | ID шаблона |
title |
string | Да | Название шаблона |
description |
string | Нет | Описание шаблона |
config |
json | Да | Настройки шаблона |
StatisticsTemplate
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
uuid | Да | ID шаблона |
title |
string | Да | Название шаблона |
description |
string | Нет | Описание шаблона |
config |
json | Да | Настройки шаблона |
created |
timestamp | Да | Дата создания шаблона |
createdBy |
uuid | Нет | ID пользователя, создавшего шаблон |
modified |
timestamp | Да | Дата изменения шаблона |
modifiedBy |
uuid | Нет | ID пользователя, изменившего шаблон |
context |
string | Нет | Контекст шаблона |
VNP-control: сервис спец команд проекта DYG
Сервис подготавливает данные для построения деревьев ВНП
Команды могут приходить как по HTTP, так и через Kafka в топик vnpcontrol_commands.
В сервисе реализованы следующие команды:
Optimistic Lock
У нескольких команд реализован механизм оптимистичных блокировок. Для этого в данных присутствует поле version.
Задача оптимистичных блокировок - предотвратить одновременное редактирование объекта из двух открытых форм.
Сначала фронтэнд запрашивает данные объекта и получает в ответе версию данных - поле version.
Он прикладывает эту версию в ответе. Если на бэкэнде она совпадает с исходной (не было других модификаций),
тогда данные сохраняются, а версия поднимается. Иначе сохранения не происходит, данные не перетираются.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.utils, в котором содержатся разные хелперы.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Конфигурирование
Требования к запуску
Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm.
Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul. Для настройки подключения к ним нужно заполнить обязательные переменные окружения из раздела ниже.
Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus, ApiGateway. В этом случае нужно уделить внимание настройкам, связанным с ServiceDiscovery и CommandDiscovery.
Во время работы, сервис общается с другими сервисами, т.е. они нужны только в момент выполнения команд. Список сервисов приведен в таблице ниже.
| Команда | Внешние сервисы |
|---|
Запуск из консоли с помощью SBT
VNPCONTROL_DB_HOST=localhost VNPCONTROL_DB_PORT=5432 VNPCONTROL_DB_NAME=vnpcontrol_db VNPCONTROL_DB_USER=postgres VNPCONTROL_DB_PASSWORD=12345 sbt boot/run
Список переменных окружения
Все доступные переменные окружения для настройки сервиса.
Настройки логеров описаны в общей документации.
| Переменная | Тип | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|---|
| VNPCONTROL_HTTP_HOST | string | нет | "0.0.0.0" | Хост, на котором слушает HTTP-сервер |
| VNPCONTROL_HTTP_PORT | int | нет | 8192 | Порт, на котором слушает HTTP-сервер |
| VNPCONTROL_KAFKA_SERVERS | string | да | "localhost:9092" | Адрес Kafka |
| VNPCONTROL_KAFKA_TOPIC | string | нет | "vnpcontrol_commands" | Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery. |
| VNPCONTROL_KAFKA_CONSUMER_GROUP | string | нет | "vnpcontrol_consumer_group" | Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске. |
| VNPCONTROL_KAFKA_PARTITIONS | int | нет | 10 | Число читаемых партиций из кафка-топика команд. |
| VNPCONTROL_KAFKA_CONSUMER_RESTART_MIN_BACKOFF | duration string | нет | 1 second | Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта) |
| VNPCONTROL_KAFKA_CONSUMER_RESTART_MAX_BACKOFF | duration string | нет | 30 seconds | Максимальное задержка до рестарта консьюмера после падения |
| VNPCONTROL_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR | double | нет | 0.2 | Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0) |
| VNPCONTROL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS | int | нет | 5 | Максимальное число рестартов консьюмера после падения (в пределах VNPCONTROL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN) |
| VNPCONTROL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN | duration string | нет | 5 minutes | Временной отрезок, в который VNPCONTROL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов |
| VNPCONTROL_KAFKA_COMMANDEVENT_TOPIC | string | да | "commandevents" | Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд. |
| VNPCONTROL_KAFKA_PROJECTCONFIGEVENT_TOPIC | string | да | "projectConfigEvents" | Название кафка-топика для отправки сообщений о событиях изменения конфигураций проекта. |
| VNPCONTROL_KAFKA_GENERATIONRULESET_TOPIC | string | да | "generationRuleSetEvents" | Название кафка-топика для отправки сообщений о событиях изменения правил генерации документа. |
| VNPCONTROL_KAFKA_NUMERATIONRULE_TOPIC | string | да | "numerationRuleEvents" | Название кафка-топика для отправки сообщений о событиях изменения правил нумерации сущности. |
| VNPCONTROL_KAFKA_VALUEGENERATIONRULE_TOPIC | string | да | "valueGenerationRuleEvents" | Название кафка-топика для отправки сообщений о событиях изменения правил заполнения полей сущностей. |
| VNPCONTROL_KAFKA_AUTH_USER | string | нет | "" | Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены. |
| VNPCONTROL_KAFKA_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Kafka. |
| VNPCONTROL_KAFKA_AUTH_PRINCIPAL | string | нет | "" | Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos). |
| VNPCONTROL_KAFKA_AUTH_KEYTAB_PATH | string | нет | "" | Путь до keytab-файла(в случае соединения с kafka через Kerberos). |
| VNPCONTROL_KAFKA_AUTH_TRUSTSTORE_LOCATION | string | нет | "" | Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применяться не будет. |
| VNPCONTROL_KAFKA_AUTH_TRUSTSTORE_PASSWORD | string | нет | "" | Пароль к хранилищу сертификатов. |
| VNPCONTROL_KAFKA_AUTH_MODE | string | нет | "static" | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| VNPCONTROL_KAFKA_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings. |
| VNPCONTROL_KAFKA_AUTH_CACHE_SIZE | int | нет | Максимальный размер кеша для Kafka producer (количество активных соединений). | |
| VNPCONTROL_KAFKA_AUTH_CACHE_TTL | duration string | нет | Время жизни Kafka producer в кеше. | |
| VNPCONTROL_CONSUL_ADDR | url string | нет | "http://localhost:8500" | Адрес Сonsul. |
| VNPCONTROL_CONSUL_AUTH_USER | string | нет | "" | Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены. |
| VNPCONTROL_CONSUL_AUTH_PASSWORD | string | нет | "" | Пароль учетной записи Сonsul. |
| VNPCONTROL_TRACE_DURATION | boolean | нет | false | Признак необходимости трассировки выполнения команд |
| VNPCONTROL_DISCOVERABLE_ID | string | нет | "another_VNPCONTROL_service_instance" | ID сервиса в ServiceDiscovery |
| VNPCONTROL_DISCOVERABLE_NAME | string | нет | "vnpcontrol" | Имя сервиса в ServiceDiscovery |
| VNPCONTROL_DISCOVERABLE_HOST | string | да | "localhost" | Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service |
| VNPCONTROL_DISCOVERABLE_PORT | int | нет | Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер. | |
| VNPCONTROL_DISCOVERABLE_LIVETIME | duration string | нет | 2 minutes | Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым. |
| VNPCONTROL_DISCOVERABLE_HEALTHPASS | string | нет | 1 minute | Периодичность отправки health check в ServiceDiscovery |
| VNPCONTROL_SERVICE_TITLE | string | нет | "Vnpcontrol" | Название сервиса для отображения |
| VNPCONTROL_SERVICE_DESCRIPTION | string | нет | "Сервис аналитики" | Описание сервиса для отображения |
| VNPCONTROL_AKKA_HTTP_CLIENT_MAXCON | int | нет | 512 | Максимальное число одновременных исходящих HTTP-соединений |
| VNPCONTROL_AKKA_HTTP_CLIENT_MAXREQ | int | нет | 1024 | Максимальное число одновременных исходящих HTTP-запросов |
| VNPCONTROL_AKKA_HTTP_SERVER_MAXCON | int | нет | 1024 | Максимальное число одновременных входящих HTTP-соединений |
| VNPCONTROL_INTERNALCMD_ALLOW | bool | нет | false | Можно ли сервису отправлять внутрисистемные команды |
| VNPCONTROL_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD | duration string | нет | 10 minutes | Время кэширования данных по командам из CommandDiscovery |
| VNPCONTROL_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD | duration string | нет | 30 seconds | Время кэширования данных по сервисам из ServiceDiscovery |
| VNPCONTROL_DB_HOST | string | да | Хост БД | |
| VNPCONTROL_DB_PORT | int | да | Порт БД | |
| VNPCONTROL_DB_NAME | string | да | Имя базы в БД | |
| VNPCONTROL_DB_URL | jdbc url string | нет | JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. | |
| VNPCONTROL_DB_USER | string | да | Пользователь БД | |
| VNPCONTROL_DB_PASSWORD | string | да | Пароль пользователя БД | |
| VNPCONTROL_DB_THREADS | int | нет | 10 | Количество потоков в пуле потоков для соединения с БД |
| VNPCONTROL_DB_QUEUE_SIZE | int | нет | 300 | Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей |
| VNPCONTROL_DB_CONN_MAX | int | нет | 10 | Максимальное количество одновременных подключений к БД |
| VNPCONTROL_DB_CONN_TIMEOUT | duration string | нет | 20 second | Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. |
| VNPCONTROL_DB_ISOLATION | string | нет | "READ_COMMITTED" | Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. |
| VNPCONTROL_DB_READONLY | boolean | нет | false | Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. |
| VNPCONTROL_DB_CONN_MIN | int | нет | = DB_THREADS | Минимальное количество одновременных подключений к БД |
| VNPCONTROL_DB_VALIDATION_TIMEOUT | duration string | нет | 1 seconds | Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. |
| VNPCONTROL_DB_IDLE_TIMEOUT | duration string | нет | 10 minutes | Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. |
| VNPCONTROL_DB_MAX_LIFETIME | duration string | нет | 30 minutes | Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. |
| VNPCONTROL_DB_INITIALIZATION_FAIL_FAST | string | нет | false | Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. |
| VNPCONTROL_DB_LEAK_DETECTION_THRESHOLD | int | нет | 0 | Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. |
| VNPCONTROL_DB_CONNECTION_TEST_QUERY | string | нет | "SELECT 1" | Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). |
| VNPCONTROL_DB_REGISTER_MBEANS | boolean | нет | false | Зарегистрированы ли JMX Management Beans («MBeans») |
| VNPCONTROL_FS_URI | string | да | http://localhost:9000/ | Адрес файлового хранилища |
| VNPCONTROL_FS_ACCESS_KEY_ID | string | да | minioadmin | Имя пользователя файлового хранилища |
| VNPCONTROL_FS_SECRET_ACCESS_KEY | string | да | minioadmin | Пароль пользователя файлового хранилища |
| VNPCONTROL_FS_UPLOAD_PARALLELISM | int | нет | 4 | Параллелизм для загрузки файлов |
| VNPCONTROL_FS_AUTH_MODE | string | нет | static | Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса |
| VNPCONTROL_FS_AUTH_CONFIG | string | нет | "" | Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[FSBucketConfig] соответствует полю authConfig FSConfigRep |
| VNPCONTROL_FS_CACHE_SIZE | int | нет | 1 | Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). |
| VNPCONTROL_FS_CACHE_TTL | duration string | нет | Время жизни клиента в кеше | |
| VNPCONTROL_EXTERNAL_MIGRATIONS_RETRY_DELAY | duration string | нет | 15 seconds | Задержка между повторными попытками запуска внешних миграций |
| VNPCONTROL_EXTERNAL_MIGRATIONS_RETRY_ATTEMPTS | int | нет | 5 | Максимальное количество попыток запуска внешних миграций |
| VNPCONTROL_DM_SCHEMA_CACHE_SIZE | int | нет | 128 | Максимальный размер кэша для json schema |
| VNPCONTROL_DM_SCHEMA_CACHE_TTL | duration string | нет | 5 minute | Время жизни элементов в кэше для json schema |
| VNPCONTROL_FTS_MAPPING_CACHE_SIZE | int | нет | 64 | Максимальный размер кэша для маппингов в полнотекстовом поиске |
| VNPCONTROL_FTS_MAPPING_CACHE_TTL | duration string | нет | 5 minute | Время жизни элементов в кэше для маппингов в полнотекстовом поиске |
| VNPCONTROL_DM_OBJECT_PAGE_SIZE | int | нет | 100 | Размер страницы при выборке объектов из data-model |
| VNPCONTROL_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS | int | нет | 5 | Поле attempts из RetrySettings |
| VNPCONTROL_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY | duration string | нет | "5 seconds" | Поле delay из RetrySettings |
| VNPCONTROL_SENDERLIB_COMMANDS_HTTP_RETRY_KIND | string | нет | "OnSomeExceptions(ConnectException)" | CommandResultRetryConditionKind |
| VNPCONTROL_DM_ENTITY_OBJECT_TOPIC | string | да | "entityObjectEvent" | Название топика из dataModel для евентов сообщений entityObject |
| VNPCONTROL_DM_ENTITY_OBJECT_TOPIC_PARTITIONS | int | да | 4 | Количество партиций топика из dataModel для евентов сообщений entityObject |
| VNPCONTROL_DM_ENTITY_OBJECT_CONSUMER_GROUP | string | да | "entity_object_consumer_group" | Консумер группа для считывания топика из dataModel для евентов сообщений entityObject |
| VNPCONTROL_DM_ENTITY_OBJECT_CONSUMER_ENABLED | boolean | да | false | Флаг для включения/отключения консумера евентов сообщений entityObject из dataModel |
| VNPCONTROL_JOURNAL_MODE | string | нет | WriteToJournal |
Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь) |
| VNPCONTROL_JOURNAL_TOPIC | string | да, если переменная VNPCONTROL_JOURNAL_MODE = WriteToTopic |
"" | Название очереди журналирования. Для режима WriteToJournal значение игнорируется. |
| VNPCONTROL_HTTP_CLIENT_CONNECTION_TIMEOUT | duration string | нет | 5 seconds | Максимальное время установления HTTP соединения |
| VNPCONTROL_HTTP_CLIENT_REQUEST_TIMEOUT | duration string | нет | 60 seconds | Максимальное время ожидания ответов на HTTP запросы |
| VNPCONTROL_MULTIPLICATOR_URI | string | да | localhost | URI сервиса multiplicator формата "http://localhost:8958" |
| VNPCONTROL_MULTIPLICATOR_ENABLE | boolean | нет | true | Включить/отключить использование сервиса multiplicator. Если выставлен false, то будет использован stub |
| VNPCONTROL_AUTOFILL_JOB_ENABLE | boolean | нет | true | Включить/отключить выполнение автоматического процесса автозаполнения |
| VNPCONTROL_AUTOFILL_JOB_CRON | string | нет | 0 0 0 * * ? |
Cron для автоматического процесса автозаполнения |
| VNPCONTROL_PROJECT_CLEAR_PAGE_SIZE | int | нет | 1000 | Очистка проекта - размер страницы при запросе данных |
| VNPCONTROL_PROJECT_CLEAR_STEP_PROCESSING_PARALLELISM | int | нет | 3 | Очистка проекта - параллелизм для запросов к разным сервисам |
| VNPCONTROL_PROJECT_CLEAR_SINGLE_STEP_PROCESSING_PARALLELISM | int | нет | 4 | Очистка проекта - параллелизм для запросов к одному сервису |
| VNPCONTROL_RESTART_ON_TIMEOUT_COUNT | int | нет | 3 | Максимальное количество попыток обращений к сервисам при таймауте |
| VNPCONTROL_HIERARCHY_CACHE_TT | duration string | Нет | 10 minutes |
TTL результата построения дерева иерархии в кэше |
| VNPCONTROL_HIERARCHY_PROCESSING_CACHE_TTL | duration string | Нет | 1 minute |
TTL результата построения дерева иерархии в кэше (для одновременных запросов) |
Список команд сервиса VNP-control
Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
Команды дерева иерархий
| Название команды | Resource | Actions | Асинхронный вызов |
|---|---|---|---|
| Сгенерировать дерево иерархии на основе конфигурации | GeneratedHierarchy | ListVnpHierarchyV2 | Нет |
| Список всех иерархичных сущностей | HierarchyEntity | ListHierarchy | Нет |
| Получить иерархичную сущность по ID | HierarchyEntity | GetHierarchy | Нет |
| Создать иерархичную сущность | HierarchyEntity | CreateHierarchy | Да |
| Отредактировать иерархичную сущность | HierarchyEntity | UpdateHierarchy | Да |
| Удалить иерархичную сущность | HierarchyEntity | DeleteHierarchy | Да |
Команды проектов
| Название команды | Resource | Actions | Асинхронный вызов |
|---|---|---|---|
| Список всех конфигураций проекта | ProjectConfig | - | Нет |
| Получить конфигурацию проекта по ID | ProjectConfig | - | Нет |
| Получить список id проектов, доступных пользователю | - | - | Нет |
| Создать конфигурацию проекта | ProjectConfig | CreateProjectConfig | Да |
| Отредактировать конфигурацию проекта | ProjectConfig | UpdateProjectConfig | Да |
| Удалить конфигурацию проекта | ProjectConfig | DeleteProjectConfig | Да |
| Очистить проект | ProjectConfig | ClearProject | Да |
| Получение конфигурации инфраструктуры проектов | - | GetProjectConfigInfrastructureInfo | Нет |
Команды генераций
| Название команды | Resource | Actions | Асинхронный вызов |
|---|---|---|---|
| Список всех правил генерации документа | GenerationRuleSet | ListGenerationRuleSet | Нет |
| Получить правило генерации документа по ID | GenerationRuleSet | GetGenerationRuleSet | Нет |
| Создать правило генерации документа | GenerationRuleSet | CreateGenerationRuleSet | Да |
| Отредактировать правило генерации документа | GenerationRuleSet | UpdateGenerationRuleSet | Да |
| Удалить правило генерации документа | GenerationRuleSet | DeleteGenerationRuleSet | Да |
| Сгенерировать сущности по указанному правилу и объекту | GenerateEntitiesItem | GenerateEntities | Да |
| Список всех правил нумерации сущности | NumerationRule | ListNumerationRule | Нет |
| Получить правило нумерации сущности по ID | NumerationRule | GetNumerationRule | Нет |
| Создать правило нумерации сущности | NumerationRule | CreateNumerationRule | Да |
| Отредактировать правило нумерации сущности | NumerationRule | UpdateNumerationRule | Да |
| Удалить правило нумерации сущности | NumerationRule | DeleteNumerationRule | Да |
| Пронумеровать сущность по указанному правилу и идентификаторам | NumerationRule | ExecuteNumeration | Да |
| Список всех правил формирования значения поля сущности | ValueGenerationRule | ListValueGenerationRule | Нет |
| Получить правило формирования значения поля сущности по ID | ValueGenerationRule | GetValueGenerationRule | Нет |
| Создать правило формирования значения поля сущности | ValueGenerationRule | CreateValueGenerationRule | Да |
| Отредактировать правило формирования значения поля сущности | ValueGenerationRule | UpdateValueGenerationRule | Да |
| Удалить правило формирования значения поля сущности | ValueGenerationRule | DeleteValueGenerationRule | Да |
| Сгенерировать шифр по указанному правилу и аттрибутам объекта | ValueGenerationRule | GenerateValueByAttributes | Да |
| Сгенерировать дополнительные поля для объектов Data Model согласно их классам | ValueGenerationRule | GenerateValueByAttributes | Да |
| Проверить дополнительные поля для объектов Data Model | ValueGenerationRule | ValidateValueByAttributes | Да |
| Смена состояния Warning-ов в метаданных сущности | ValueGenerationRule | ChangeWarningStatus | Да |
| Получить список событий генерации всех типов | GenerationJournal | ListGenerationJournal | Нет |
| Получить карточку события генерации всех типов | GenerationJournal | GetGenerationJournal | Нет |
| Получить прогресс по задачам генерации | GenerateEntitiesItem | GenerateEntities | Нет |
| Автозаполнение полей сущностей | AutofillValue | AutofillValueForEntities | Да |
| Поиск дублей в полях объектов | CheckDuplicates | CheckDuplicatesForEntities | Да |
| Генерация визуальных форм | UiForm | GenerateUiForms | Да |
Команды матрицы прав
| Название команды | Resource | Actions | Асинхронный вызов |
|---|---|---|---|
| Изменить список групп раздела прав | PolicySection | EditPolicySectionGroups | Да |
| Изменить список разделов группы | PolicySection | EditPolicySectionGroups | Да |
| Список разделов прав | PolicySection | ListPolicySections | Нет |
| Кол-во разделов у групп | PolicySection | ListPolicySections | Нет |
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
ListVnpHierarchyV2
Payload для команды
{
"hierarchyCode": "TagTree",
"hierarchySearch": {
"search": {
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
},
"expandTree": true
},
"useCache": true
}
Результат выполнения команды
{
"tree": {
"items": [
{
"entityObject": {
"id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"hierarchyEntityId": "HierarchyEntityId",
"parentId": null,
"data": {
"code": "10",
"title": "Блок кондуктор",
"nodeType": "entityObject",
"entityObject": {
"objectId": "9acdb6e7-18d2-42bd-bbd2-af5d4f98662a",
"entityType": "Object"
}
},
"externalType": "entityObject",
"externalEntityType": "Object",
"externalId": "9acdb6e7-18d2-42bd-bbd2-af5d4f98662a",
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"removed": false,
"version": 2
},
"isMatched": true,
"childrenCount": 10,
"entityObjectLowWarningCount": 0,
"entityObjectCriticalWarningCount": 2,
"childrenWithLowWarningCount": 5,
"childrenWithCriticalWarningCount": 6,
"children": [
{
"entityObject": "{ other child entity object }",
"isMatched": true,
"other ExtendedDto fields...": "...also with children"
},
"next children..."
]
}
],
"total": 1
},
"statistic": [
{
"nodeType": "entityObject",
"entityCodeType": "Object",
"count": 1
},
{
"nodeType": "entityObject",
"entityCodeType": "complex",
"count": 19
},
{
"nodeType": "entityObject",
"entityCodeType": "system",
"count": 78
},
{
"nodeType": "entityObject",
"entityCodeType": "TagTypes",
"count": 9
},
{
"nodeType": "tag",
"entityCodeType": "Tag",
"count": 1
}
]
}
Команда отображения полного дерева ВНП. Без предварительной генерации строить дерево по
данным [hierarchyEntity -> data]*2.
Не все настройки генерации передаются со входными данными, часть так же указана в поле иерархии
data -> HierarchyData.Settings.
- Опциональные параметры baseEntityFilterField*. Для фильтрации базовой сущности можно применить атрибут её модели данных и предполагаемое значение. Правила заполнения аналогичны работе с Search, но только по одному атрибуту.
- На входе: ListVnpHierarchyDto
- На выходе: TreeWithStatistic
| Команда | Путь |
|---|---|
| vnpcontrol_ListVnpHierarchyV2 | v1/hierarchy/listVnpHierarchyV2 |
ListHierarchyEntity
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 5
}
}
Результат выполнения команды
{
"items": [
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description1",
"data": {
"someInfo": {
"info": "info",
"numberInfo": 10
}
},
"created": 1736862738971,
"createdBy": "837068a9-1e9c-4326-a449-5c830c0115fd",
"modified": 1736930690417,
"modifiedBy": "837068a9-1e9c-4326-a449-5c830c0115fd",
"version": 8
}
],
"total": 1
}
Получение списка иерархичных сущностей с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[HierarchyEntity]
| Команда | Путь |
|---|---|
| vnpcontrol_listHierarchyEntities | HTTP POST "/v1/hierarchyEntity/list" |
GetHierarchyEntity
Payload для команды
"HierarchyEntityId"
Результат выполнения команды
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"created": 1664292962695,
"createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"modified": 1664292962695,
"modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"version": 2
}
Получение иерархичной сущности.
- Input: UUID задачи
- Output: HierarchyEntity
| Команда | Путь |
|---|---|
| vnpcontrol_getHierarchyEntity | HTTP POST "/v1/hierarchyEntity/get" |
CreateHierarchyEntity
Payload для команды
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"externalType": "catalogItem",
"externalEntityType": "CatalogCode1",
"externalId": "6d873b43-0913-4fde-827c-968f13ebf778"
}
Результат выполнения команды
"HierarchyEntityId"
Добавление новой иерархичной сущности.
- Input: HierarchyEntityCreateDto
- Output: Id созданной задачи
| Команда | Путь |
|---|---|
| vnpcontrol_createHierarchyEntity | - |
UpdateHierarchyEntity
Payload для команды
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"version": 1
}
Результат выполнения команды
true
Обновление иерархичной сущности.
- Input: HierarchyEntityUpdateDto
- Output: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_updateHierarchyEntity | - |
DeleteHierarchyEntity
Payload для команды
"hierarchyEntityId"
Результат выполнения команды
true
Удаление иерархичной сущности.
- Input: ID иерархичной сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_deleteHierarchyEntity | - |
ListProjectConfig
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"title": "Sample Project Title 1",
"tag": "sample-tag 1",
"documentSettings": [
{
"entityType": "document-content 1",
"documentFilter": {
"field": "stadia",
"sections": [
"09dc7d4c-acc5-466c-9c58-96fd21080600",
"aeb4fe43-3af1-45bc-99e6-cb3aca812b85",
"7a959af2-6e9a-4d5d-8a63-f611adf4bfd0"
],
"isRelation": false,
"showRemainder": false
}
}
],
"created": 1723553566671,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723553569099,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"registry": [
"a"
],
"projectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"objectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"additionalData": {
"b": "c"
},
"version": 2
}
],
"total": 1
}
Возвращает список всех конфигураций проекта. Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ProjectConfig]
| Команда | Путь |
|---|---|
| vnpcontrol_ListProjectConfig | HTTP POST "/v1/projectConfig/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery, LikeQuery |
| title | InSetQuery, LikeQuery, TsQuery |
| tag | InSetQuery, LikeQuery, TsQuery |
| document | InSetQuery, LikeQuery, TsQuery |
| projectType | InSetQuery |
| objectType | InSetQuery |
| created | RangeQuery |
| createdBy | InSetQuery |
| modified | RangeQuery |
| modifiedBy | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| title |
| tag |
| created |
| modified |
| projectType |
| objectType |
| createdBy |
| modifiedBy |
GetProjectConfig
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"title": "Sample Project Title 1",
"tag": "sample-tag 1",
"documentSettings": [
{
"entityType": "document-content 1",
"documentFilter": {
"field": "stadia",
"sections": [
"09dc7d4c-acc5-466c-9c58-96fd21080600",
"aeb4fe43-3af1-45bc-99e6-cb3aca812b85",
"7a959af2-6e9a-4d5d-8a63-f611adf4bfd0"
],
"isRelation": false,
"showRemainder": false
}
}
],
"created": 1723553566671,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1723553569099,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"registry": [
"a"
],
"projectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"objectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"additionalData": {
"b": "c"
},
"version": 2
}
Поиск конфигурации проекта с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: ProjectConfigId (String)
- На выходе: ProjectConfig
| Команда | Путь |
|---|---|
| vnpcontrol_GetProjectConfig | HTTP POST "/v1/projectConfig/get" |
GetProjectConfigInfrastructureInfo
Payload для команды
[
"d33"
]
Результат выполнения команды
[
{
"projectCode": "d33",
"database": {
"exists": false,
"name": "data_model_d33"
},
"kafkaTopics": {},
"s3buckets": {},
"deployment": {
"exists": false,
"state": "unknown",
"name": "data-model-d33"
}
}
]
Получение конфигурации инфраструктуры проектов по их id (string). Поддерживается только синхронный вызов.
- На входе: ProjectConfigId
- На выходе: InfrastructureInfo
| Команда | Путь |
|---|---|
| vnpcontrol_GetProjectConfigInfrastructureInfo | HTTP POST "/v1/projectConfig/listInfrastructure" |
ListUserProjects
Payload для команды
{}
Результат выполнения команды
[
"project1",
"project2"
]
Список id проектов, доступных текущему пользователю. Поддерживается только синхронный вызов.
- На входе: {}
- На выходе: String[]
| Команда | Путь |
|---|---|
| vnpcontrol_ListUserProjects | HTTP POST "/v1/projectConfig/listForUser" |
CreateProjectConfig
Payload для команды
{
"id": "some-id",
"title": "Sample Project Title",
"tag": "sample-tag",
"documentSettings": [
{
"entityType": "document-content 1",
"documentFilter": {
"field": "stadia",
"sections": [
"09dc7d4c-acc5-466c-9c58-96fd21080600",
"aeb4fe43-3af1-45bc-99e6-cb3aca812b85",
"7a959af2-6e9a-4d5d-8a63-f611adf4bfd0"
],
"isRelation": false,
"showRemainder": false
}
}
],
"registry": [],
"projectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"objectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"additionalData": {}
}
Результат выполнения команды
"some-id"
Добавляет новую конфигурацию проекта с заданными параметрами. Отправляет событие о создании конфигурации проекта.
- На входе: CreateProjectConfig
- На выходе: ProjectConfigId (String)
| Команда | Путь |
|---|---|
| vnpcontrol_CreateProjectConfig | - |
UpdateProjectConfig
Payload для команды
{
"id": "some-id",
"title": "Sample Project Title 1",
"tag": "sample-tag 1",
"documentSettings": [
{
"entityType": "document-content 1",
"documentFilter": {
"field": "stadia",
"sections": [
"09dc7d4c-acc5-466c-9c58-96fd21080600",
"aeb4fe43-3af1-45bc-99e6-cb3aca812b85",
"7a959af2-6e9a-4d5d-8a63-f611adf4bfd0"
],
"isRelation": false,
"showRemainder": false
}
}
],
"registry": [
"a"
],
"projectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"objectType": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"additionalData": {
"b": "c"
},
"version": 1
}
Результат выполнения команды
true
Обновляет данные о конфигурации проекта. Отправляет событие об обновлении конфигурации проекта.
- На входе: UpdateProjectConfig
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_UpdateProjectConfig | - |
DeleteProjectConfig
Payload для команды
"some-id"
Результат выполнения команды
true
Удаляет конфигурацию проекта с заданным идентификатором. Отправляет событие об удалении проекта конфигурации.
- На входе: ProjectConfigId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_DeleteProjectConfig | - |
ClearProject
Payload для команды
"project1"
Команда не возвращает данных
Производит полную очистку проекта
- На входе: ProjectConfigId (String)
- На выходе: Нет
| Команда | Путь |
|---|---|
| vnpcontrol_ClearProject | - |
ListGenerationRuleSet
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"title": "Sample GenerationRule Title 2",
"description": "some description 2",
"buttonTitle": "trueTitle",
"action": "action2",
"rules": [
"rule2"
],
"created": 1726211900106,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1726211947374,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 2
}
],
"total": 1
}
Возвращает список всех конфигураций проекта. Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[GenerationRuleSet]
| Команда | Путь |
|---|---|
| vnpcontrol_ListGenerationRuleSet | HTTP POST "/v1/generationRuleSet/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery, LikeQuery |
| title | InSetQuery, LikeQuery, TsQuery |
| description | InSetQuery, LikeQuery, TsQuery |
Доступные поля для сортировки:
| Поле |
|---|
| title |
| description |
| created |
| modified |
GetGenerationRuleSet
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"title": "Sample GenerationRule Title 2",
"description": "some description 2",
"buttonTitle": "trueTitle",
"action": "action2",
"rules": [
"rule2"
],
"created": 1726211900106,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1726211947374,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 2
}
Получение набора правил генерации сущностей с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: GenerationRuleSetId (String)
- На выходе: GenerationRuleSet
| Команда | Путь |
|---|---|
| vnpcontrol_GetGenerationRuleSet | HTTP POST "/v1/generationRuleSet/get" |
CreateGenerationRuleSet
Payload для команды
{
"id": "some-id",
"title": "Sample GenerationRule Title",
"description": "some description",
"buttonTitle": "document-content",
"action": "action",
"rules": [
"rule1"
]
}
Результат выполнения команды
"some-id"
Добавляет новый набор правил генерации сущностей с заданными параметрами. Отправляет событие о создании набора правил генерации сущностей.
- На входе: CreateGenerationRuleSet
- На выходе: GenerationRuleSetId (String)
| Команда | Путь |
|---|---|
| vnpcontrol_CreateGenerationRuleSet | - |
UpdateGenerationRuleSet
Payload для команды
{
"id": "some-id",
"title": "Sample GenerationRule Title 2",
"description": "some description 2",
"buttonTitle": "trueTitle",
"action": "action2",
"rules": [
"rule2"
],
"version": 1
}
Результат выполнения команды
true
Обновляет данные о наборе правил генерации сущностей. Отправляет событие об обновлении набора правил генерации сущностей.
- На входе: UpdateGenerationRuleSet
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_UpdateGenerationRuleSet | - |
DeleteGenerationRuleSet
Payload для команды
"some-id"
Результат выполнения команды
true
Удаляет набор правил генерации сущностей с заданным идентификатором. Отправляет событие об удалении набора правил генерации сущностей.
- На входе: GenerationRuleSetId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_DeleteGenerationRuleSet | - |
GenerateEntities
Payload для команды
{
"generationRuleSetId": "some-gen-rule-id-3",
"numerationRuleId": "19b027c6-50b7-4bae-a8f0-72746d2a25b4",
"generateValues": "true",
"entityType": "Object",
"search": {
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
}
}
}
Результат выполнения команды
"69b027c6-50b7-4bae-a8f0-72746d2a25bd"
Генерирует и создаёт объекты в сервисе DataModel. Возвращает ID записи журнала генерации, он же ID задачи на генерацию (для отмены задачи) и реестра сгенерированных сущностей (пока не поддерживается)
- На входе: GenerateEntitiesInput
- На выходе: GenerationJournalId (UUID)
| Команда | Путь |
|---|---|
| vnpcontrol_GenerateEntities | - |
ListNumerationRule
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample NumerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
},
"created": 1726211900106,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1726211947374,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 2
}
],
"total": 1
}
Возвращает список всех правил нумерации сущностей. Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[NumerationRule]
| Команда | Путь |
|---|---|
| vnpcontrol_ListNumerationRule | HTTP POST "/v1/numerationRule/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery, LikeQuery |
| entityType | InSetQuery |
| fieldCode | InSetQuery |
| title | InSetQuery, LikeQuery, TsQuery |
| description | InSetQuery, LikeQuery, TsQuery |
Доступные поля для сортировки:
| Поле |
|---|
| title |
| description |
| created |
| modified |
GetNumerationRule
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample NumerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
},
"created": 1726211900106,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1726211947374,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 2
}
Получение правила нумерации сущностей с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: NumerationRuleId (String)
- На выходе: NumerationRule
| Команда | Путь |
|---|---|
| vnpcontrol_GetNumerationRule | HTTP POST "/v1/numerationRule/get" |
CreateNumerationRule
Payload для команды
{
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample NumerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
}
}
Результат выполнения команды
"some-id"
Добавляет новое правило нумерации сущностей с заданными параметрами. Отправляет событие о создании правила нумерации сущностей.
- На входе: CreateNumerationRule
- На выходе: NumerationRuleId (String)
| Команда | Путь |
|---|---|
| vnpcontrol_CreateNumerationRule | - |
UpdateNumerationRule
Payload для команды
{
"id": "some-id",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample NumerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
},
"version": 1
}
Результат выполнения команды
true
Обновляет данные о правиле нумерации сущностей. Отправляет событие об обновлении правила нумерации сущностей.
- На входе: UpdateNumerationRule
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_UpdateNumerationRule | - |
DeleteNumerationRule
Payload для команды
"some-id"
Результат выполнения команды
true
Удаляет правило нумерации сущностей с заданным идентификатором. Отправляет событие об удалении правила нумерации сущностей.
- На входе: NumerationRuleId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_DeleteNumerationRule | - |
ExecuteNumeration
Payload для команды
{
"numerationRuleId": "19b027c6-50b7-4bae-a8f0-72746d2a25b4",
"entityType": "SomeEntity",
"ids": [
"27c623b0-a253a-4bae-a8f0-72746d250b7",
"237c623b-a253a-4bae-a8f0-72746d250b4"
]
}
Результат выполнения команды
"3b97ba40-e44b-46ce-8644-30dd5958c855"
Запускает процесс нумерации сущностей в сервисе DataModel. Возвращает ID записи журнала генерации, он же ID задачи на генерацию (для отмены задачи)
- На входе: ExecuteNumerationInput
- На выходе: GenerationJournalId (UUID)
| Команда | Путь |
|---|---|
| vnpcontrol_ExecuteNumeration | - |
ListValueGenerationRule
Возвращает список всех правил формирования значения атрибута сущностей. Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[ValueGenerationRule]
| Команда | Путь |
|---|---|
| vnpcontrol_ListValueGenerationRule | HTTP POST "/v1/valueGenerationRule/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery, LikeQuery |
| ruleType | InSetQuery |
| entityType | InSetQuery |
| fieldCode | InSetQuery |
| title | InSetQuery, LikeQuery, TsQuery |
| description | InSetQuery, LikeQuery, TsQuery |
Доступные поля для сортировки:
| Поле |
|---|
| title |
| description |
| created |
| modified |
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "some-id",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample ValueGenerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
},
"created": 1726211900106,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1726211947374,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 2
}
],
"total": 1
}
GetValueGenerationRule
Payload для команды
"some-id"
Результат выполнения команды
{
"id": "some-id",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample ValueGenerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
},
"created": 1726211900106,
"createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"modified": 1726211947374,
"modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
"version": 2
}
Получение правила формирования значения атрибута сущностей с заданным идентификатором. Поддерживается только синхронный вызов.
- На входе: ValueGenerationRuleId (String)
- На выходе: ValueGenerationRule
| Команда | Путь |
|---|---|
| vnpcontrol_GetValueGenerationRule | HTTP POST "/v1/valueGenerationRule/get" |
CreateValueGenerationRule
Payload для команды
{
"ruleType": "cipher",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample ValueGenerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
}
}
Результат выполнения команды
"some-id"
Добавляет новое правило формирования значения атрибута сущностей с заданными параметрами. Отправляет событие о создании правила формирования значения атрибута сущностей.
- На входе: ValueGenerationRuleCreateDto
- На выходе: ValueGenerationRuleId (String)
| Команда | Путь |
|---|---|
| vnpcontrol_CreateValueGenerationRule | - |
UpdateValueGenerationRule
Payload для команды
{
"id": "some-id",
"ruleType": "cipher",
"entityType": "Some EntityTypeId",
"fieldCode": "some fieldCode",
"title": "Sample ValueGenerationRule Title 2",
"description": "some description 2",
"config": {
"rule2": "attr56"
},
"version": 1
}
Результат выполнения команды
true
Обновляет данные о правиле формирования значения атрибута сущностей. Отправляет событие об обновлении правила формирования значения атрибута сущностей.
- На входе: ValueGenerationRuleUpdateDto
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_UpdateValueGenerationRule | - |
DeleteValueGenerationRule
Payload для команды
"some-id"
Результат выполнения команды
true
Удаляет правило формирования значения атрибута сущностей с заданным идентификатором. Отправляет событие об удалении правила формирования значения атрибута сущностей.
- На входе: ValueGenerationRuleId (String)
- На выходе: Boolean
| Команда | Путь |
|---|---|
| vnpcontrol_DeleteValueGenerationRule | - |
GenerateValueByAttributes
Payload для команды
{
"valueGenerationRuleId": "49b027c6-50b7-3219-a8f0-72746d2a25b7",
"attributes": {
"field1": "value1",
"field2": "value2",
"field3": "value3"
}
}
Результат выполнения команды
"value1-value2.value3"
Генерирует строку на основание правила и переданных атрибутов объекта.
- На входе: GenerateValueByAttributesInput
- На выходе: String
| Команда | Путь |
|---|---|
| vnpcontrol_GenerateValueByAttributes | - |
GenerateValueForEntities
Payload для команды
{
"entityType": "Object",
"ruleType": "cipher",
"search": {
"query": "id",
"context": {
"id": "11112222-3333-4444-5555-666677778888"
}
},
"valueGenerationRuleId": "1f2f3b8e-d722-489a-9297-316b0afbc04a"
}
Результат выполнения команды
"3b97ba40-e44b-46ce-8644-30dd5958c855"
Поле valueGenerationRuleId опционально, если передано, используется правило с таким ID, если нет, происходит вычисление правил.
Генерирует атрибуты для объектов Data Model по условию поиска. Учитывая их класс в сервисе Classification, который хранит идентификаторы правил генерации. Возвращает ID записи журнала генерации, он же ID задачи на генерацию (для отмены задачи)
- На входе: GenerateValueForEntitiesInput
- На выходе: GenerationJournalId (UUID)
| Команда | Путь |
|---|---|
| vnpcontrol_GenerateValueForEntities | - |
CheckValueGenerationForEntities
Payload для команды
{
"entityType": "Object",
"ruleType": "cipher",
"search": {
"query": "id",
"context": {
"id": "11112222-3333-4444-5555-666677778888"
}
}
}
Результат выполнения команды
{
"successEntities": [
"3b97ba40-e44b-46ce-8644-30dd5958c855"
],
"failureEntities": []
}
Проверяет атрибуты Data Model по условиям поиска.
Обновляет список предупреждений объекта, список доступных кодов предупреждений: checkValueGenerationTooManyRules,
checkValueGenerationSectionCount, checkValueGenerationSectionLength, checkValueGenerationAttributeMismatch,
checkValueGenerationAttributeNotExists.
- На входе: GenerateValueForEntitiesInput
- На выходе: GenerateValueForEntitiesOutput
| Команда | Путь |
|---|---|
vnpcontrol_CheckValueGenerationForEntities |
- |
ChangeWarningStatus
Payload для команды
{
"objectId": "784eee29-e1a6-4f57-8e45-b4fd469d6658",
"entityType": "Tag",
"fieldCode": "complex",
"warningType": "autofillCurrentValueNotValid",
"status": "Inactive"
}
Результат выполнения команды
true
Смена состояния Warning-ов в метаданных сущности.
Поддерживается только синхронный вызов.
- На входе:
ChangeWarningStatusDto - На выходе:
Boolean
| Команда | Путь |
|---|---|
vnpcontrol_ChangeWarningStatus |
HTTP POST v1/valueGenerationRule/changeWarningStatus |
ListGenerationJournal
Payload для команды
{
"query": "",
"context": {},
"sorting": {
"fieldName": "title",
"order": "desc"
},
"paging": {
"page": 1,
"count": 10
}
}
Результат выполнения команды
{
"items": [
{
"id": "f7445e44-deb5-4605-ba0b-cff45c8b9e5b",
"title": "gen ent title",
"generationType": "GenerateEntities",
"generationStatus": "Created",
"input": {
"key": "value"
},
"report": {
"key": "value"
},
"created": 0,
"createdBy": "119061e6-542d-4ef1-b503-224efc6b6d6a",
"modified": 0,
"modifiedBy": "7f782541-3fff-4ca0-8363-690dd4ae1755",
"version": 1
},
{
"id": "df11dede-fb96-4569-a667-7f35c73794aa",
"title": "gen ent title",
"generationType": "GenerateEntities",
"generationStatus": "Created",
"input": {
"key": "value"
},
"report": {
"key": "value"
},
"created": 0,
"createdBy": "deba1fe5-5848-41e0-b971-90ffb1d9fd5d",
"modified": 0,
"modifiedBy": "5c452843-4926-4578-821a-d0c2554f11f5",
"version": 1
}
],
"total": 2
}
Возвращает список генераций. Поддерживается только синхронный вызов.
- На входе: Option[Search]
- На выходе: Page[GenerationJournal]
| Команда | Путь |
|---|---|
| vnpcontrol_ListGenerationJournal | HTTP POST "/v1/journal/list" |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| id | InSetQuery |
| generationType | InSetQuery |
| generationStatus | InSetQuery |
| createdBy | InSetQuery |
| created | RangeQuery |
Доступные поля для сортировки:
| Поле |
|---|
| id |
| generationType |
| generationStatus |
| createdBy |
| created |
GetGenerationJournal
Payload для команды
"f7445e44-deb5-4605-ba0b-cff45c8b9e5b"
Результат выполнения команды
{
"id": "f7445e44-deb5-4605-ba0b-cff45c8b9e5b",
"title": "gen ent title",
"generationType": "GenerateEntities",
"generationStatus": "Created",
"input": {
"key": "value"
},
"report": {
"key": "value"
},
"created": 0,
"createdBy": "119061e6-542d-4ef1-b503-224efc6b6d6a",
"modified": 0,
"modifiedBy": "7f782541-3fff-4ca0-8363-690dd4ae1755",
"version": 1
}
Получение карточки генерации. Поддерживается только синхронный вызов.
- На входе: GenerationJournalId (UUID)
- На выходе: GenerationJournal
| Команда | Путь |
|---|---|
| vnpcontrol_GetGenerationJournal | HTTP POST "/v1/journal/get" |
GenerationProgress
Payload для команды
{
"id": "d40a62c9-2fd6-470a-a595-1535a0cc262c"
}
Результат выполнения команды
{
"d40a62c9-2fd6-470a-a595-1535a0cc262c": {
"estimateTime": "PT30M3.903S",
"percent": 0.8333333333333334,
"stats": {
"contextCreated": {
"succeed": 1,
"skipped": null,
"total": 1
},
"generated": {
"succeed": 1,
"skipped": null,
"total": 1
},
"numerated": {
"succeed": 1,
"skipped": null,
"total": 1
},
"attributesAdded": {
"succeed": 1,
"skipped": null,
"total": 1
},
"submitted": {
"succeed": 1,
"skipped": null,
"total": 1
},
"reported": {
"succeed": 0,
"skipped": null,
"total": 1
},
"errors": 0
}
}
}
Прогресс задач генерации. Можно отфильтровать по идентификатору конкретной задачи. Указанный здесь GenerateEntitiesItemId это все ещё ID задачи, а так же ID записи журнала с отчётом.
estimateTime - на данный момент показывает оставшееся время некорректно.
percent скорее всего никогда не будет равен 1 (100%). По окончанию работы статистика пропадает и нужно смотреть статус
у записи журнала генерации.
Поддерживается только синхронный вызов.
- На входе: GetGenerationProgressDto
- На выходе: Map[GenerateEntitiesItemId (UUID), EstimateProgressStats]
| Команда | Путь |
|---|---|
| vnpcontrol_GenerationProgress | - |
EditPolicySectionGroups
Payload для команды
{
"code": "Section1",
"groups": [
"admins"
]
}
Команда не возвращает данных
Обновить список групп раздела прав
- На входе: EditPolicySectionGroupsInput
- На выходе: Нет данных
| Команда | Путь |
|---|---|
| vnpcontrol_EditPolicySectionGroups | - |
EditGroupPolicySections
Payload для команды
{
"group": "admins",
"policySectionCodes": ["section1", "section2"]
}
Команда не возвращает данных
Обновить список разделов прав у группы
- На входе: EditGroupPolicySectionsInput
- На выходе: Нет данных
| Команда | Путь |
|---|---|
| vnpcontrol_EditGroupPolicySections | - |
ListPolicySections
Payload для команды
{
"query": "",
"context": {}
}
Результат выполнения команды
{
"items": [
{
"id": "d40a62c9-2fd6-470a-a595-1535a0cc262c",
"code": "Section1",
"title": "Раздел 1",
"defaultGroups": [
"admin"
],
"rules": [
{
"actions": [
"CreateNumerationRule",
"DeleteNumerationRule"
],
"attributes": {
"resource.entityType": [
"NumerationRule"
]
}
}
],
"category": {
"id": "d40a62c9-2fd6-470a-a595-1535a0cc262c",
"code": "Category1",
"title": "Категория 1"
},
"groups": [
"admins"
]
}
],
"total": 1
}
Получить список разделов прав
Поддерживается только синхронный вызов.
- На входе: Search
- На выходе: Page[PolicySectionViewDTO]
| Команда | Путь |
|---|---|
| vnpcontrol_ListPolicySections | - |
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| code | InSetQuery |
| title | InSetQuery, LikeQuery, TsQuery |
| category.code | InSetQuery |
| category.title | InSetQuery, LikeQuery, TsQuery |
| group | InSetQuery |
Доступные поля для сортировки:
| Поле |
|---|
| code |
| title |
| category.code |
| category.title |
При сортировке по-умолчанию записи будут отсортированы согласно порядку в миграции
GroupPolicySectionsCount
Payload для команды
["group1", "group2"]
Результат выполнения команды
[
{
"group": "group1",
"policySectionCount": 5
},
{
"group": "group2",
"policySectionCount": 0
}
]
Получить список разделов прав
Поддерживается только синхронный вызов.
- На входе: String[]
- На выходе: GroupPolicySectionsCountResult[]
| Команда | Путь |
|---|---|
| vnpcontrol_GroupPolicySectionsCount | - |
AutofillValueForEntities
Payload для команды
{
"entityType": ["System", "Document"],
"search": {
"query": "",
"context": {}
}
}
Результат выполнения команды
{
"successEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"],
"failureEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"]
}
Запустить процесс автозаполнения полей для указанных сущностей
- На входе: AutofillValueForEntitiesInput
- На выходе: AutofillValueForEntitiesOutput
| Команда | Путь |
|---|---|
| vnpcontrol_AutofillValueForEntities | - |
CheckDuplicatesForEntities
Payload для команды
{
"entityType": "Document",
"search": {
"query": "",
"context": {}
}
}
Результат выполнения команды
{
"fields": ["someField"],
"successEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"],
"failureEntities": [],
"processedEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"],
"duplicateEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"]
}
Запустить процесс поиска дублей объектов по полям сущности, добавление специальных ворнингов для таких объектов.
- На входе: CheckDuplicatesForEntitiesInput
- На выходе: CheckDuplicatesForEntitiesOutput
| Команда | Путь |
|---|---|
| vnpcontrol_CheckDuplicatesForEntities | - |
GenerateUiForms
Payload для команды
{
"entityTypeId": "FormTesting",
"formCodes": ["card", "list", "createForm", "editForm", "filterPanel"],
"addClassificationBlock": false
}
Команда не возвращает данных
Сгенерировать визуальные формы для сущности
- На входе: GenerateUiFormsInput
- На выходе: Нет данных
| Команда | Путь |
|---|---|
| vnpcontrol_GenerateUiForms | - |
Модели сервиса VNP-control
ListVnpHierarchyDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| hierarchySearch | HierarchySearch | да | Параметры запроса для дерева иерархий |
| hierarchyCode | String | да | Идентификатор сущности иерархии |
| useCache | Boolean | да | Использовать кэш |
TreeWithStatistic
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| tree | Page[HierarchyEntityObjectExtendedDto] | да | Обновлённое дерево с добавленными объектами на основе тегов |
| statistic | TreeStatisticItem[] | да | Информация о количестве пар nodeType + entityType |
TreeStatisticItem
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| nodeType | String | да | Тип узла |
| entityCodeType | String | да | Идентификатор сущности справочника |
| count | Int | да | Количество узлов с таким типом и идентификатором |
HierarchyEntity
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID |
| title | string | да | имя сущности |
| description | string | да | описание сущности |
| data | json | да | доп. данные |
| context | String | нет | Код проекта к которому относится объект |
| created | TimeStamp | да | дата и время создания |
| createdBy | UUID | да | ID создавшего запись пользователя |
| modified | TimeStamp | да | дата и время изменения |
| modifiedBy | UUID | да | ID изменившего запись пользователя |
| version | Integer | да | версия для оптимистичной блокировки |
HierarchyEntityCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID |
| title | string | да | имя сущности |
| description | string | да | описание сущности |
| data | json | нет | доп. данные |
HierarchyEntityUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | string | да | ID |
| title | string | да | имя сущности |
| description | string | да | описание сущности |
| data | json | нет | доп. данные |
| version | Integer | да | версия для оптимистичной блокировки |
ProjectConfigCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ProjectConfigId (String) | Да | Уникальный идентификатор проекта - строковый код |
| title | String | Да | Наименование проекта (отображение в списках, отчетах и т.п.) |
| tag | String | Нет | Строка - код сущности которая в проекте является "тегом" |
| documentSettings | DocumentSetting[] | Нет | Строка - код сущности которая в проекте является "документом" |
| projectType | UUID | Нет | Тип проекта (элемент справочника) |
| objectType | UUID | Нет | Тип объекта (элемент справочника) |
| registry | String[] | Нет | Массив строк - кодов сущностей |
| additionalData | JSON (Object) | Нет | Дополнительные данные |
ProjectConfigUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ProjectConfigId (String) | Да | Уникальный идентификатор проекта - строковый код |
| title | String | Да | Наименование проекта (отображение в списках, отчетах и т.п.) |
| tag | String | Нет | Строка - код сущности которая в проекте является "тегом" |
| documentSettings | DocumentSetting[] | Нет | Строка - код сущности которая в проекте является "документом" |
| registry | String[] | Нет | Массив строк - кодов сущностей |
| projectType | UUID | Нет | Тип проекта (элемент справочника) |
| objectType | UUID | Нет | Тип объекта (элемент справочника) |
| additionalData | JSON (Object) | Нет | Дополнительные данные |
| version | Int | Да | Индекс оптимистической блокировки |
ProjectConfig
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ProjectConfigId (String) | Да | Уникальный идентификатор проекта - строковый код |
| title | String | Да | Наименование проекта (отображение в списках, отчетах и т.п.) |
| tag | String | Нет | Код сущности, которая в проекте является "тегом" |
| documentSettings | DocumentSetting[] | Нет | Настройки сущности, которая является документом |
| registry | String[] | Да | Массив строк - кодов сущностей |
| projectType | UUID | Нет | Тип проекта (элемент справочника) |
| objectType | UUID | Нет | Тип объекта (элемент справочника) |
| additionalData | JSON (Object) | Да | Дополнительные данные |
| version | Int | Да | Индекс оптимистической блокировки |
| created | Long | Да | Дата создания записи |
| modified | Long | Да | Дата изменения записи |
| createdBy | UserId (UUID) | Да | ID пользователя создавшего запись |
| modifiedBy | UserId (UUID) | Да | ID пользователя изменившего запись |
InfrastructureInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| projectCode | ProjectConfigId (String) | Да | Уникальный код проекта |
| database | JSON | Да | Настройки базы данных |
| kafkaTopics | JSON | Да | Топики событий Kafka |
| s3buckets | JSON | Да | Настройки бакета S3 |
| deployment | DeploymentInfo | Да | Настройка развертывания |
DeploymentInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| exists | Boolean | Да | Флаг существования |
| state | String | Да | Состояние |
| name | String | Да | Имя |
DocumentSetting
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | String | Да | Тип объекта сервиса Data Model |
| documentFilter | DocumentFilter | Нет | Описание настроек формирования срезов документов |
DocumentFilter
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| field | String | Да | Название поля по которому формируется срез |
| isRelation | Boolean | Да | Является ли поле связью или собственным атрибутом объекта |
| sections | String[] | Да | Конкретные значения для разбиения |
| showRemainder | Boolean | Нет | Нужно ли отображать неформализованный остаток |
GenerationRuleSetCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | GenerationRuleSetId (String) | Да | Уникальный строковый идентификатор записи - он же код |
| title | String | Да | Заголовок набора правил - краткое описание для реестра |
| description | String | Нет | Подробное описание того что должно происходить при генерации документов по этому набору правил |
| buttonTitle | String | Да | Что будет написано в кнопке на генерацию по этому набору |
| action | String | Нет | Action для проверки права доступа к кнопке этого набора правил |
| rules | JSON (Array)*1 | Да | Упорядоченный массив объектов - правил генерации документов. |
GenerationRuleSetUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | GenerationRuleSetId (String) | Да | Уникальный строковый идентификатор записи - он же код |
| title | String | Да | Заголовок набора правил - краткое описание для реестра |
| description | String | Нет | Подробное описание того что должно происходить при генерации документов по этому набору правил |
| buttonTitle | String | Да | Что будет написано в кнопке на генерацию по этому набору |
| action | String | Нет | Action для проверки права доступа к кнопке этого набора правил |
| rules | JSON (Array)*1 | Да | Упорядоченный массив объектов - правил генерации документов. |
| version | Int | Да | Индекс оптимистической блокировки |
GenerationRuleSet
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | GenerationRuleSetId (String) | Да | Уникальный строковый идентификатор записи - он же код |
| title | String | Да | Заголовок набора правил - краткое описание для реестра |
| description | String | Нет | Подробное описание того что должно происходить при генерации документов по этому набору правил |
| buttonTitle | String | Да | Что будет написано в кнопке на генерацию по этому набору |
| action | String | Нет | Action для проверки права доступа к кнопке этого набора правил |
| rules | JSON (Array)*1 | Да | Упорядоченный массив объектов - правил генерации документов. |
| context | String | Нет | Код проекта к которому относится объект |
| created | Long | Да | Дата создания записи |
| modified | Long | Да | Дата изменения записи |
| createdBy | UserId (UUID) | Да | ID пользователя создавшего запись |
| modifiedBy | UserId (UUID) | Да | ID пользователя изменившего запись |
| version | Int | Да | Индекс оптимистической блокировки |
GenerateEntitiesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| generationRuleSetId | GenerationRuleSetId (String) | Да | Уникальный строковый идентификатор записи - он же код |
| numerationRuleId | NumerationRuleId (String) | Нет | Идентификатор дополнительного правила генерации номера |
| valueGenerationRuleId | ValueGenerationRuleId (String) | Нет | Идентификатор правила генерации наименований перекрывающий правила указанные в конфиге |
| generateValues | Boolean | Нет | Запускать ли генерацию дополнительных полей для получившихся объектов |
| entityType | EntityTypeId (String) | Да | Тип объекта сервиса Data Model |
| search | Search | Да | Фильтры для подбора начальных объектов для создания сущностей |
GenerateValueForEntitiesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | EntityTypeId (String) | Да | Тип объекта сервиса Data Model |
| search | Search | Да | Фильтры для подбора начальных объектов для создания сущностей |
| ruleType | ValueGenerationRuleType (String) | Да | Тип правила для генерации (дополнительно фильтрует выбранные правила) |
| valueGenerationRuleId | UUID | Нет | Идентификатор правила генерации для обхода процесса вычисления правил |
GenerateValueForEntitiesOutput
HierarchyData_Settings
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| baseEntityFilterFieldCode | String | Нет | Название поля для фильтрации базовой сущности |
| baseEntityFilterFieldValue | Json | Нет | Значение поля для фильтрации базовой сущности |
NumerationRuleCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | String | Да | Для какой сущности написано правило |
| fieldCode | String | Да | Для какого поля сущности написано правило |
| title | String | Да | Заголовок правила - краткое описание для реестра |
| description | String | Нет | Подробное описание правила |
| config | JSON | Да | Описание правила нумерации сущности. |
NumerationRuleUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | NumerationRuleId (UUID) | Да | Уникальный идентификатор записи |
| entityType | String | Да | Для какой сущности написано правило |
| fieldCode | String | Да | Для какого поля сущности написано правило |
| title | String | Да | Заголовок правила - краткое описание для реестра |
| description | String | Нет | Подробное описание правила |
| config | JSON | Да | Описание правила нумерации сущности. |
| version | Int | Да | Индекс оптимистической блокировки |
NumerationRule
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | NumerationRuleId (UUID) | Да | Уникальный идентификатор записи |
| entityType | String | Да | Для какой сущности написано правило |
| fieldCode | String | Да | Для какого поля сущности написано правило |
| title | String | Да | Заголовок правила - краткое описание для реестра |
| description | String | Нет | Подробное описание правила |
| config | JSON | Да | Описание правила нумерации сущности. |
| context | String | Нет | Код проекта к которому относится объект |
| created | Long | Да | Дата создания записи |
| modified | Long | Да | Дата изменения записи |
| createdBy | UserId (UUID) | Да | ID пользователя создавшего запись |
| modifiedBy | UserId (UUID) | Да | ID пользователя изменившего запись |
| version | Int | Да | Индекс оптимистической блокировки |
ExecuteNumerationInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| numerationRuleId | NumerationRuleId (String) | Нет | Идентификатор дополнительного правила генерации номера |
| entityType | EntityTypeId (String) | Да | Тип объекта сервиса Data Model |
| search | Search | Да | Фильтры для подбора начальных объектов для создания сущностей |
ValueGenerationRuleCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| ruleType | String | Да | Тип правила: title - формирование наименования, cipher - формирование шифра |
| entityType | String | Да | Для какой сущности написано правило |
| fieldCode | String | Да | Для какого поля сущности написано правило |
| title | String | Да | Заголовок правила - краткое описание для реестра |
| description | String | Нет | Подробное описание правила |
| delimiter | String | Нет | Разделитель добавляемый между секциями |
| config | JSON | Да | Описание правила формирования значения поля сущности. |
ValueGenerationRuleUpdateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ValueGenerationRuleId (UUID) | Да | Уникальный идентификатор записи |
| ruleType | String | Да | Тип правила: title - формирование наименования, cipher - формирование шифра |
| entityType | String | Да | Для какой сущности написано правило |
| fieldCode | String | Да | Для какого поля сущности написано правило |
| title | String | Да | Заголовок правила - краткое описание для реестра |
| description | String | Нет | Подробное описание правила |
| delimiter | String | Нет | Разделитель добавляемый между секциями |
| config | JSON | Да | Описание правила формирования значения поля сущности. |
| version | Int | Да | Индекс оптимистической блокировки |
ValueGenerationRule
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ValueGenerationRuleId (UUID) | Да | Уникальный идентификатор записи |
| ruleType | String | Да | Тип правила: title - формирование наименования, cipher - формирование шифра |
| entityType | String | Да | Для какой сущности написано правило |
| fieldCode | String | Да | Для какого поля сущности написано правило |
| title | String | Да | Заголовок правила - краткое описание для реестра |
| description | String | Нет | Подробное описание правила |
| delimiter | String | Нет | Разделитель добавляемый между секциями |
| config | JSON | Да | Описание правила формирования значения поля сущности. |
| context | String | Нет | Код проекта к которому относится объект |
| created | Long | Да | Дата создания записи |
| modified | Long | Да | Дата изменения записи |
| createdBy | UserId (UUID) | Да | ID пользователя создавшего запись |
| modifiedBy | UserId (UUID) | Да | ID пользователя изменившего запись |
| version | Int | Да | Индекс оптимистической блокировки |
GenerationJournal
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | GenerationRuleSetId (String) | Да | Уникальный строковый идентификатор записи - он же код |
| title | String | Да | Наименование генерации |
| generationType | GenerationType (String) | Да | Тип генерации (сущностей, атрибутов, нумерация) |
| generationStatus | GenerationStatus (String) | Да | Статус процесса (стадии) |
| input | GenerateEntitiesInput | Да | Входные данные (payload запроса генерации) |
| report | GenerateEntitiesReport | Да | Отчёт о генерации: получившиеся данные, контекст и/или ошибки |
| context | String | Нет | Код проекта к которому относится объект |
| created | Long | Да | Дата создания записи |
| modified | Long | Да | Дата изменения записи |
| createdBy | UserId (UUID) | Да | ID пользователя создавшего запись |
| modifiedBy | UserId (UUID) | Да | ID пользователя изменившего запись |
| version | Int | Да | Индекс оптимистической блокировки |
GenerateEntitiesReport
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| reportUrl | StoredFile (String) | Нет | URI файла отчёта (стандартная FS загрузка). Формат для генерации сущностей, Формат для нумерации, Формат для генерации шифров и наименований |
| errors | String[] | Нет | Глобальные ошибки генерации |
DetailedReason
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fieldCode | FieldName (String) | Нет | Поле промежуточного объекта, которое было указано в цепочке получения целевых данных |
| entityType/catalogCode | EntityTypeId/CatalogCode (String) | Нет | Тип объекта Data Model или код справочника Alexandrina |
| objectId/catalogItemId | ObjectId/CatalogItemId (String) | Нет | ID объекта Data Model или ID справочника Alexandrina |
| sectionIdx | Int | Да | Номер секции шифра в которой возникла проблема |
Warning
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| message | String | Да | Сообщение об ошибке |
| fieldCode | FieldName (String) | Да | Поле к которому относиться предупреждение |
| warningType | WarningType (String) | Да | Тип предупреждения |
| detailedReason | DetailedReason | Нет | Дополнительные данные для диагностики в случае работы с шифрами |
| valueGenerationRuleId | UUID | Нет | Правило при применении которого возникла проблема |
| severity | WarningSeverity (String) | Да | Уровень серьезности предупреждения (низкий, критический) |
| status | WarningStatus (String) | Да | Статус предупреждения (активно, неактивно) |
| statusChangeDate | TimeStamp (Long) | Нет | Дата смены статуса |
| statusChangeUserId | UserId (UUID) | Нет | Пользователь сменивший статус |
EntityGenerationReport
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| position | RulePosition | Да | Информация об источнике сущности относительно, правила и генератора |
| context | ContextItemSimple | Нет | Информация о контексте (объектах на основании которых мы генерируем новую сущность) |
| generatingEntity | CreateObject | Нет | Результат генерации (DTO для создания объекта в Data Model) |
| isCreated | Boolean | Да | Флаг успешного создания в сервисе Data Model |
| rules | GenerationRuleInfo | Да | Перечень задействованных правил генерации (нумерация, атрибуты, шифры) |
| errors | String[] | Да | Список ошибок помешавших созданию объекта |
| warnings | Warning[] | Да | Список предупреждений не препятствующих созданию объекта (также сохраняется в метаинформацию объекта) |
RulePosition
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| ruleSetId | GenerationRuleSetId (String) | Да | Уникальный строковый идентификатор записи - он же код |
| ruleIdx | Int | Нет | Порядковый номер правила в наборе правил генерации документа |
| generatorIdx | Int[] | Нет | Порядковый номер генератора в наборе правил генерации документа. Массив так как у генераторов есть вложенность |
ContextItemSimple
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | Да | Уникальный идентификатор объекта: сущности или справочника |
| entityType | EntityTypeId (String) | Одно из двух (1) | Тип сущности Data Model |
| catalogCode | CatalogCode (String) | Одно из двух (1) | Код справочника Alexandrina |
| code | String | Нет | Код объекта |
| title | String | Нет | Заголовок объекта |
CreateObject
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | Да | Уникальный идентификатор объекта Data Model |
| entityType | UUID | Да | Тип сущности Data Model |
| dataAttributes | UUID | Да | Данные объекта |
| metadataAttributes | UUID | Да | Мета информация (предупреждения возникшие во время генерации, etc...) |
| objectSource | UUID | Да | Источник (название этого сервис) |
| relations | UUID | Да | Связи с другими объектами Data Model |
| priorityFields | UUID | Да | Поля которые были сгенерированы (имеют приоритет при генерации шифров и дополнительных атрибутов и не замещаются полями полученными из классификации) |
EntityNumerationReport
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| category | NumerationCategoryPart | Да | Список полей по котором осуществлялась группировка для нумерации |
| entity | ReportingEntity | Да | Упрощенная модель данных объекта |
| dataAttributesBefore | JSON Object | Да | Атрибуты до генерации (указано только поле нумерации) |
| rules | GenerationRuleInfo | Да | Перечень задействованных правил генерации (нумерация, атрибуты, шифры) |
| errors | String[] | Да | Список ошибок помешавших обновлению объекта |
| warnings | Warning | Да | Список предупреждений не препятствующих обновлению объекта |
NumerationCategoryPart
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fieldCode | FieldName (String) | Да | Код поля категории |
| fieldValue | JSON (Any) | Да | Значение поля категории |
AttributeGenerationReport
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entity | ReportingEntity | Да | Упрощенная модель данных объекта |
| dataAttributesBefore | JSON Object | Да | Атрибуты до генерации (указано только поле нумерации или только поля шифра/заголовка) |
| rules | GenerationRuleInfo | Да | Перечень задействованных правил генерации (нумерация, атрибуты, шифры) |
| errors | String[] | Да | Список ошибок помешавших обновлению объекта |
| warnings | Warning | Да | Список предупреждений не препятствующих обновлению объекта |
ReportingEntity
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | ObjectId (UUID) | Да | Уникальный идентификатор объекта Data Model |
| entityType | ValueGenerationRuleType (String) | Нет | Тип сущности Data Model |
| dataAttributes | ValueGenerationRuleType (String) | Нет | Данные объекта (только поле из нумерации или только поля шифра/заголовка) |
GenerationRuleInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | Да | Уникальный идентификатор правила (если ruleType не указан, значит это правило нумерации) |
| ruleType | ValueGenerationRuleType (String) | Нет | Тип правила генерации (только для шифров и атрибутов) |
| fieldCode | String | Да | Код поля для которого написано правило |
| title | String | Да | Название правила |
GetGenerationProgressDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | GenerateEntitiesItemId (UUID) | Нет | Получить статистику только для указанной задачи |
ChangeWarningStatusDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
objectId |
UUID (ObjectId) |
Да | UUID объекта |
entityType |
String (EntityTypeId) |
Да | Код сущности |
fieldCode |
String (FieldName) |
Да | Код поля |
warningType |
String (WarningType) |
Да | Код предупреждения |
status |
String (WarningStatus) |
Да | Состояние Active/Inactive |
sectionIdx |
Int |
Нет | Id секции шифра |
EstimateProgressStats
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| estimateTime | Duration ISO8601 | Да | Время до конца в таком формате PT12H54M5.02S |
| percent | Double | Да | Процент выполнения (уже рассчитанные цифры из stats) |
| stats | GenerationStatistic | Да | Числа статистики |
GenerationStatistic
На данный момент статистика представлена в виде завершения этапа: 0/1 (начато); 1/1 (выполнено)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| contextCreated | StatFraction | Да | Подготовка контекста, сбор объектов от рута по пользовательскому пути |
| generated | StatFraction | Да | Создание объектов по атрибутам из генератора |
| numerated | StatFraction | Да | Нумерация по указанному правилу |
| attributesAdded | StatFraction | Да | Добавление атрибутов |
| submitted | StatFraction | Да | Сохранение в Data Model |
| reported | StatFraction | Да | Сохранение отчёта в S3 |
| errors | Int | Да | Количество объектов с ошибкой |
StatFraction
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| succeed | Int | Да | Успешно обработано |
| skipped | Int | Нет | Пропущено |
| total | Int | Да | Всего операций |
Модели server-common
HierarchyEntityObject
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| id | UUID | да | ID |
| hierarchyEntityId | string | да | ID сущности объекта |
| parentId | UUID | нет | Родительский объект |
| data | json | да | доп. данные |
| externalType | ExternalEntityTypes | нет | код типа внешнего объекта |
| externalEntityType | string | нет | тип объекта хранящегося в ноде (код каталога или EntityType) |
| externalId | string | нет | код или UUID внешнего объекта |
| created | TimeStamp | да | дата и время создания |
| createdBy | UUID | да | ID создавшего запись пользователя |
| modified | TimeStamp | да | дата и время изменения |
| modifiedBy | UUID | да | ID изменившего запись пользователя |
| isActualRevision | Boolean | нет | признак актуальной ревизии |
| removed | Boolean | да | признак удаления |
| version | Integer | да | версия для оптимистичной блокировки |
HierarchyEntityObjectCreateDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| hierarchyEntityId | string | да | ID сущности объекта |
| parentId | UUID | нет | Родительский объект |
| data | json | да | доп. данные |
| externalType | ExternalEntityTypes | нет | код типа внешнего объекта |
| externalEntityType | string | нет | тип объекта хранящегося в ноде (код каталога или EntityType) |
| externalId | string | нет | код или UUID внешнего объекта |
HierarchyEntityObjectExtendedDto
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityObject | HierarchyEntityObject | да | Сущность иерархий |
| isMatched | Boolean | да | Попадает ли объект под фильтр |
| childrenCount | Integer | да | Количество дочерних объектов на следующем уровне |
| children | HierarchyEntityObjectExtendedDto[] | нет | Дочерние объекты |
| entityObjectLowWarningCount | Integer | да | Количество несерьезных предупреждений у текущего объекта (узла) |
| entityObjectCriticalWarningCount | Integer | да | Количество серьезных предупреждений у текущего объекта (узла) |
| childrenWithLowWarningCount | Integer | да | Количество несерьезных предупреждений у дочерних объектов (узлов) |
| childrenWithCriticalWarningCount | Integer | да | Количество серьезных предупреждений у дочерних объектов (узлов) |
HierarchySearch
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| search | Search | да | Параметры запроса |
| expandTree | Boolean | да | Раскрыть родителей для всех подходящих под фильтр объектов |
| parentId | UUID | нет | Ограничить вывод объектов указанным родителем |
ExternalEntityTypes
| Тип | Определение |
|---|---|
| catalogItem | Объект сервиса каталогов |
| entityObject | Объект сервиса моделей данных |
EntityType
Тип сущности в модели данных
| Поле | Тип | Описание |
|---|---|---|
| id | String | Строковый код типа сущности |
| title | String | Название типа сущности для вывода в UI |
| description | String | Развернутое описание типа сущности |
| settings | Json | Настройки типа сущности (подробнее в документации сервиса Data Model) |
EditPolicySectionGroupsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| code | String | да | Код раздела прав |
| groups | String[] | да | Коды групп пользователей |
EditGroupPolicySectionsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| group | String | да | Код группы пользователей |
| policySectionCodes | String[] | да | Коды разделов прав |
GroupPolicySectionsCountResult
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| group | String | да | Код группы пользователей |
| policySectionCount | Int | да | Количество разделов прав |
PolicySectionViewDTO
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| code | String | да | Код раздела прав |
| title | String | да | Название раздела прав |
| defaultGroups | String[] | да | Группы по-умолчанию |
| rules | PolicySectionRule[] | да | Правила |
| category | PolicySectionCategory[] | да | Категория раздела |
| groups | String[] | да | Группы раздела |
PolicySectionRule
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| actions | String[] | да | Список действий правила |
| attributes | Object | да | Аттрибуты правила (ключ-значение) |
PolicySectionCategory
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| code | String | да | Код категории раздела прав |
| title | String | да | Название категории раздела прав |
FilePolicySection
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| code | String | да | Код раздела прав |
| title | String | да | Название раздела прав |
| defaultGroups | String[] | да | Группы по-умолчанию |
| rules | PolicySectionRule[] | да | Правила |
| categoryCode | String | да | Код категории раздела |
AutofillValueForEntitiesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | String[] | да | Список сущностей |
| search | Search | да | Фильтры для объектов |
AutofillValueForEntitiesOutput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| successEntities | uuid[] | да | Список успешно обработанных id объектов |
| failureEntities | uuid[] | да | Список id объектов обработанных с ошибкой |
CheckDuplicatesForEntitiesInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | String | да | Сущность для проверки |
| search | Search | да | Фильтры для объектов |
CheckDuplicatesForEntitiesOutput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| fields | string[] | да | Поля объектов для поиска дублей |
| successEntities | uuid[] | да | Список успешно обработанных id объектов |
| failureEntities | uuid[] | да | Список id объектов обработанных с ошибкой |
| processedEntities | uuid[] | да | Список id объектов, с которыми работали |
| duplicateEntities | uuid[] | да | Список id объектов, у которых дубли |
GenerateUiFormsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityTypeId | string | да | ID сущности |
| formCodes | string[] | да | Коды визуальных форм |
| addClassificationBlock | boolean | да | Добавить блок классификации |
Возможные значения formCodes:
- card - Карточка объекта
- list - Реестр
- createForm - Форма создания
- editForm - Форма редактирования
- filterPanel - Панель фильтров в реестре
Примечания
*1 - Подробнее на странице Confluence -> Техническая документация -> Генерация документов
*2 - Подробнее на странице Confluence -> Техническая документация -> Конфиг динамического дерева [или -> Конфиг для ВНП]
Матрица прав
Для изменения содержимого матрицы необходимо внести изменения в
policySectionCategory.json и policySection.json и повысить версию
в policySectionCustomChange.xml.
Формат policySectionCategory:
[
{
"code": "Hierarchy",
"title": "Иерархия"
}
]
Модель данных: PolicySectionCategory
Формат policySection:
[
{
"code": "ProjectEntitiesView",
"title": "Доступ в раздел \"Справочники проекта\"",
"categoryCode": "ProjectEntities",
"defaultGroups": ["admin"],
"rules": [
{
"actions": [
"DataModel_GetObject"
],
"attributes": {
"resource.entityType": [
"SomeEntityType"
]
}
}
]
}
]
Модель данных: FilePolicySection