NAV
json

Classification: сервис классификации объектов сущностей

Сервис позволяет классифицировать объекты различных сущностей по полям этих объектов. Команды могут приходить как по HTTP, так и через Kafka в топик classification_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Конфигурирование 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_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
Получение иерархии классов EntityClass ListEntityClassHierarchy
Получение ветви иерархии классов до определенного узла EntityClass GetEntityClass
Статистика количества классов у сущности EntityClass EntityTypeClassCount
Получение класса EntityClass GetEntityClass
Получение списка классов EntityClass ListEntityClasses
Классификация типа EntityClass ClassifyObject
Список полей объекта для классифицированного типа EntityClass CalculateManagedFields
Создание нового класса EntityClass CreateEntityClass
Редактирование класса EntityClass UpdateEntityClass
Удаление класса EntityClass DeleteEntityClass
Обновления атрибутов EntityObject с учетом классификации Произвольный EntityType из ObjectStorage DataModel_UpdateObject
Классы категоризированные по правилу генерации атрибутов EntityClass ClassifyObject
Обновление правил генерации в классах EntityClass UpdateEntityClass
Добавление массива кодов полей в классы EntityClass UpdateEntityClass
Удаление массива кодов полей в классы 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": []
  }
]

Возвращает дерево сущностей классов

Команда Путь
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
  }
]

Возвращает всех родителей сущности класса, в порядке от ближайшего до самого дальнего

Команда Путь
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
}

Получить сущность класса по её идентификатору

Команда Путь
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
}

Получить список сущностей класса

Команда Путь
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 модели>": "..."
        }
      }
    ]
  }
]

Классификация типа сущности.

Команда Путь
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
  }
]

Получить список полей объекта для классифицированного типа.

Команда Путь
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"

Добавление нового класса сущности.

Команда Путь
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

Обновление класса сущности.

Команда Путь
classification_UpdateEntityClass Kafka Topic "classification_commands"

DeleteEntityClass (classification)

Payload для команды

"00001111-2222-3333-4444-555566667777"

Результат выполнения команды

true

Удаление класса сущности.

Команда Путь
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), показывающая, что не произошло обновления из-за некорректной версии.

Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

Команда Путь
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
      }
    ]
  }
]

Получить список классов содержащих переданные идентификаторы правила, и сгруппированные по ним. Классы могут дублироваться в категориях

Поддерживается только синхронный вызов. Результат выполнения команды не журналируется.

Команда Путь
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
  }
]

Добавить новое правило генерации значений к классам. С возможностью исключения правила из классов, идентификаторы которых не указаны

Поддерживается асинхронный и синхронный вызов. Результат выполнения команды не журналируется.

Команда Путь
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.

Поддерживается асинхронный и синхронный вызов. Результат выполнения команды не журналируется.

Команда Путь
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. Остальные поля не должны поменять свой порядок по отношению друг к другу.

Команда Путь
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 проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью 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_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
}

Возвращает список всех задач экспорта.

Поддерживается только синхронный вызов.

Команда Путь
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
}

Поиск задачи экспорта с заданным идентификатором.

Поддерживается только синхронный вызов.

Команда Путь
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. Иначе поле будет пустое и файл будет иметь дефолтное название.

Отправляет событие о создании задачи экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
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

Обновляет данные задачи экспорта. Отправляет событие об обновлении задачи экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
exporter_UpdateExportProcess -

DeleteExportProcess

Payload для команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Результат выполнения команды

true

Удаляет задачу экспорта с заданным идентификатором. Отправляет событие об удалении задачи экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
exporter_DeleteExportProcess -

ExecuteExportProcess

Payload для команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Результат выполнения команды

true

Запускает задачу экспорта с заданным идентификатором. Отправляет событие о результатах выполнения задачи экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
exporter_ExecuteExportProcess -

CancelExportProcess

Payload для команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Результат выполнения команды

true

Останавливает запущенную задачу экспорта с заданным идентификатором.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
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
      }
    ]
  }
}

Прогресс задач экспорта. Можно отфильтровать по идентификатору конкретной задачи. Поддерживается только синхронный вызов.

Команда Путь
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.

Добавляет новую задачу экспорта с заданными параметрами, а затем ее запускает.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
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
}

Возвращает список всех шаблонов экспорта.

Поддерживается только синхронный вызов.

Команда Путь
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
}

Поиск задачи экспорта с заданным идентификатором.

Поддерживается только синхронный вызов.

Команда Путь
exporter_GetExportTemplate HTTP POST "/v1/exportTemplate/get"

CreateExportTemplate

Payload для команды

{
  "entityType": "abc",
  "title": "Шаблон всего",
  "description": "Описание шаблона на которое никто не смотрит",
  "exportConfig": {
    "title": "Sample Project Title"
  }
}

Результат выполнения команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Добавляет новый шаблон экспорта с заданными параметрами. Отправляет событие о создании шаблона экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
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

Обновляет данные шаблона экспорта. Отправляет событие об обновлении шаблона экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
exporter_UpdateExportTemplate -

DeleteExportTemplate

Payload для команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Результат выполнения команды

true

Удаляет шаблон экспорта с заданным идентификатором. Отправляет событие об удалении шаблона экспорта.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
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 проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью 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_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_SAVE_BATCH_COUNT int нет 50 Количество обрабатываемых строк в importer

Список команд сервиса 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": {
        "startRow": 1,
        "columnMapping": [
          {
            "columnLabel": "A",
            "property": "code",
            "propertyPKField": "code",
            "isPKProperty": true,
            "isExternalId": false
          }
        ],
        "allowDeleteRelations": false,
        "multipleValueSeparator": ";"
      },
      "importFile": [
        {
          "fileName": "file.xsls",
          "importUrl": "importer/import/adda7125-0608-471e-a999-347f5fe860ce"
        }
      ],
      "resultFile": [
        {
          "reportUrl": "report/adda7125-0608-471e-a999-347f5fe860ce",
          "importFileIdx": 1,
          "executedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
          "executed": 1723809067603
        }
      ],
      "info": {
        "error": "some error",
        "stats": {
          "name": "one",
          "updates": {
            "succeed": 1,
            "total": 1
          },
          "creates": {
            "succeed": 1,
            "total": 1
          },
          "deleteRelations": {
            "succeed": 1,
            "total": 1
          },
          "createRelations": {
            "succeed": 1,
            "total": 1
          },
          "errors": 1
        }
      },
      "created": 1723809067603,
      "createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
      "modified": 1723809067603,
      "modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
      "executed": null,
      "executedBy": null,
      "version": 1
    }
  ],
  "total": 1
}

Возвращает список всех задач импорта. Поддерживается только синхронный вызов.

Команда Путь
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": {
    "startRow": 1,
    "columnMapping": [
      {
        "columnLabel": "A",
        "property": "code",
        "propertyPKField": "code",
        "isPKProperty": true,
        "isExternalId": false
      }
    ],
    "allowDeleteRelations": false,
    "multipleValueSeparator": ";"
  },
  "importFile": [
    {
      "fileName": "file.xsls",
      "importUrl": "importer/import/adda7125-0608-471e-a999-347f5fe860ce"
    }
  ],
  "resultFile": [
    {
      "reportUrl": "report/adda7125-0608-471e-a999-347f5fe860ce",
      "importFileIdx": 1,
      "executedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
      "executed": 1723809067603
    }
  ],
  "info": {
    "error": "some error",
    "stats": {
      "name": "one",
      "updates": {
        "succeed": 1,
        "total": 1
      },
      "creates": {
        "succeed": 1,
        "total": 1
      },
      "deleteRelations": {
        "succeed": 1,
        "total": 1
      },
      "createRelations": {
        "succeed": 1,
        "total": 1
      },
      "errors": 1
    }
  },
  "created": 1723809067603,
  "createdBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
  "modified": 1723809067603,
  "modifiedBy": "7099494d-0a5f-47ff-bc52-9cfb74ffe282",
  "executed": null,
  "executedBy": null,
  "version": 1
}

Поиск задачи импорта с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
importer_GetImportProcess HTTP POST "/v1/importProcess/get"

CreateImportProcess

Payload для команды

{
  "entityType": "abc",
  "importConfig": {
    "startRow": 1,
    "columnMapping": [
      {
        "columnLabel": "A",
        "property": "code",
        "propertyPKField": "code",
        "isPKProperty": true,
        "isExternalId": false
      }
    ],
    "allowDeleteRelations": false,
    "multipleValueSeparator": ";"
  },
  "importFile": "importer/import/adda7125-0608-471e-a999-347f5fe860ce"
}

Результат выполнения команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Добавляет новую задачу импорта с заданными параметрами. Отправляет событие о создании задачи импорта.

Команда Путь
importer_CreateImportProcess -

UpdateImportProcess

Payload для команды

{
  "id": "f283aac5-88e0-43b5-8dab-56c22d91acc7",
  "entityType": "abc",
  "importConfig": {
    "startRow": 1,
    "columnMapping": [
      {
        "columnLabel": "A",
        "property": "code",
        "propertyPKField": "code",
        "isPKProperty": true,
        "isExternalId": false
      }
    ],
    "allowDeleteRelations": false,
    "multipleValueSeparator": ";"
  },
  "importFile": "importer/import/adda7125-0608-471e-a999-347f5fe860ce",
  "version": 1
}

Результат выполнения команды

true

Обновляет данные задачи импорта. Отправляет событие об обновлении задачи импорта.

Команда Путь
importer_UpdateImportProcess -

DeleteImportProcess

Payload для команды

"f283aac5-88e0-43b5-8dab-56c22d91acc7"

Результат выполнения команды

true

Удаляет задачу импорта с заданным идентификатором. Отправляет событие об удалении задачи импорта.

Команда Путь
importer_DeleteImportProcess -

ExecuteImportProcess

Payload для команды

"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"

Результат выполнения команды

true

Запускает задачу импорта с заданным идентификатором. Отправляет событие о результатах выполнения задачи импорта.

Команда Путь
importer_ExecuteImportProcess -

CancelImportProcess

Payload для команды

"b251c2e5-e12c-4792-b6f4-6578bfd4d6cd"

Результат выполнения команды

true

Остановка задачи импорта с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
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
      }
    ]
  }
}

Прогресс задач импорта. Можно отфильтровать по идентификатору конкретной задачи. Поддерживается только синхронный вызов.

Команда Путь
importer_GetImportProgress -

Модели сервиса Importer

ImportProcessCreateDto

Поле Тип Обязательное Описание
entityType EntityTypeId (String) Да Тип импортируемой сущности
importConfig ImportConfig Да Конфигурация импорта
importFile String Да URI файла (стандартная FS загрузка)

ImportProcessUpdateDto

Поле Тип Обязательное Описание
id ImportProcessId (UUID) Да Уникальный идентификатор задачи
entityType EntityTypeId (String) Да Тип импортируемой сущности
importConfig ImportConfig Да Конфигурация импорта
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: сервис для пакетной загрузки

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью 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_JOB_TIMEOUT duration string нет 12 hours Максимальное время выполнения пакетной загрузки по расписанию

Список команд сервиса 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
Остановка пакетной загрузки PackageImportConfig CancelPackageImport

В описании команд используется путь/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
}

Возвращает список всех конфигов пакетной загрузки. Поддерживается только синхронный вызов.

Команда Путь
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
}

Поиск конфига пакетной загрузки с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
packageImporter_GetPackageImportConfig HTTP POST "/v1/packageImportConfig/get"

CreatePackageImportConfig

Payload для команды

{
  "title": "title",
  "description": "Some testable package import config",
  "config": {}
}

Результат выполнения команды

"some-id"

Добавляет новый конфиг пакетной загрузки. Отправляет событие о создании конфига. Также, если указан cronSettings, пытается запустить новые процессы по крону.

Команда Путь
packageImporter_CreatePackageImportConfig -

UpdatePackageImportConfig

Payload для команды

{
  "id": "some-id",
  "title": "title",
  "description": "Some VERY testable package import config (new description)",
  "config": {}
}

Результат выполнения команды

true

Обновляет данные о конфиге пакетной загрузки. Отправляет событие об обновлении конфига. Также, если обновляем cronSettings, пытается запустить новые процессы по крону, по старому крону создаваться процессы не будут.

Команда Путь
packageImporter_UpdatePackageImportConfig -

DeletePackageImportConfig

Payload для команды

"some-id"

Результат выполнения команды

true

Удаляет конфиг пакетной загрузки с заданным идентификатором. Отправляет событие об удалении конфига. Удаляет создание новых крон процессов.

Команда Путь
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
}

Возвращает список всех процессов пакетной загрузки. Поддерживается только синхронный вызов.

Команда Путь
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"
}

Поиск процесса пакетной загрузки с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
packageImporter_GetPackageImportProcess HTTP POST "/v1/packageImportProcess/get"

DeletePackageImportProcess

Payload для команды

"some-id"

Результат выполнения команды

true

Удаляет процесс пакетной загрузки с заданным идентификатором. Также удаляет все записи в таблице файлов, связанные с этим процессом. И также удаляются все processedFilePath из s3 от записей в таблице файлов со статусом NotLocated. Отправляет событие об удалении процесса.

Команда Путь
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
}

Возвращает список всех файлов пакетной загрузки. Поддерживается только синхронный вызов.

Команда Путь
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.

Наши варианты:

  1. Файл обрабатывался один раз и с первого раза попал в карточку. Запись в таблице у него одна и она в состоянии Success
  2. Файл обрабатывался много раз но до сих пор не попал в карточку. Записей в таблице у него несколько и они все NonLocated
  3. Файл обрабатывался много раз, и первые несколько раз ему не удалось подобрать карточку, но в последний раз удалось. У него несколько записей в таблице - несколько NonLocated и одна Success

Роут возвращает то, что описано во втором пункте.

Поддерживается только синхронный вызов.

Команда Путь
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.

Команда Путь
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.

Важно: логика ручного распределения отличается от логики обычной пакетной загрузки, мы не создаем записи о файлах и процессах, а также получаем другие статусы в ситуациях для файла.

Команда Путь
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"
}

Поиск файла пакетной загрузки с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
packageImporter_GetPackageImportFile HTTP POST "/v1/packageImportFile/get"

DeletePackageImportFile

Payload для команды

  "some-id"

Результат выполнения команды

true

Удаление файла пакетной загрузки с заданным идентификатором. Если файл со статусом NOT LOCATED, пройзойдет попытка удаления файла из s3 по тому пути, который описан в processedFilePath. Если нет пути - не удалит, но удалит из бд. Поддерживается только синхронный вызов.

Команда Путь
packageImporter_DeletePackageImportFile

DeletePackageImportFileSearch

Payload для команды

{
  "query": "",
  "context": {},
  "sorting": null,
  "paging": null
}

Результат выполнения команды

true

Удаление файлов пакетной загрузки с заданным идентификатором. Аналогичное удаление как и в DeletePackageImportFile, но передается Search вместо id. Возможна ошибка EntityNotFound, если нет таких файлов в бд. Поля sort и paging при удалении не учитываются. Поддерживается только синхронный вызов.

Команда Путь
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.

Поддерживается только синхронный вызов.

Команда Путь
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.

Поддерживается только синхронный вызов.

Команда Путь
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

Команда Путь
packageImporter_CheckNetworkFolder HTTP POST "/v1/packageImport/checkNetworkFolder"

ClearProjectData

Payload для команды

{
  "context": "d33"
}

Останавливаются все крон процессы от конфигов с указанным контекстом, процессы со статусом IN PROGRESS. После удаляются - файлы, процессы, конфиги. Также чистится папка temp, куда скачиваются файлы (перед удалением).

Команда Путь
packageImporter_ClearProjectData HTTP POST "/v1/packageImport/clearProjectData"

CancelPackageImportProcess

Payload для команды

"3050f39c-a691-4986-a439-69b81d4fddbb"

Останавливает процесс пакетной загрузки

Команда Путь
packageImporter_CancelPackageImportProcess -

Модели сервиса 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 PackageImportFileStatus Да Состояние процесса импорта
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 Да Состояние процесса
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 PackageImportFileStatus Да Состояние процесса импорта
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 Нет Название проекта для удаления

PackageImportProcessStatus

Возможные значения:

PackageImportFileStatus

Возможные значения:

project-copy: сервис копирования проектов

Команды могут приходить как по HTTP, так и через Kafka в топик project_copy_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью 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_PROGRESS_WRITE_INTERVAL int нет 10 Интервал записи прогресса выполнения шага
PROJECT_COPY_DIFF_CACHE_TTL duration string нет 10 minutes Время жизни снапшот кэша

Список команд сервиса project-copy

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

В сервисе реализованы команды:

Название команды Resource Actions
Получение снапшота проекта ProjectCopy GetSnapshot
Список элементов коллекции снапшота ProjectCopy ListSnapshotItems
Запустить процесс копирования ProjectCopy CreateAndRunPlan
Запустить полный процесс копирования ProjectCopy CreateAndRunPlan
Создать планы синхронизации ProjectCopy CreateSyncPlan
Перезапуск синхронизации синхронизации ProjectCopy RestartSyncProcess
Является ли проект пустым ProjectCopy IsProjectEmpty
Получить процесс копирования ProjectCopy GetCopyProcess
Список процессов копирования ProjectCopy ListCopyProcesses
Удалить процессы копирования по id ProjectCopy ListCopyProcesses
Список шагов процессов копирования ProjectCopy ListCopyProcessSteps
Подтвердить или отклонить изменения ProjectCopy ProcessSteps
Список связей коллекций ProjectCopy ListCollectionLinks
Список связей элементов коллекции ProjectCopy ListCollectionItemLinks
Трансформировать элемент коллекции ProjectCopy MapEntity
Поиск связанных сущностей ProjectCopy ListCollectionItemLinks
Список моделей сущностей для синхронизации ProjectCopy ListSyncItems
Список моделей каталога для синхронизации ProjectCopy ListSyncItems
Список объектов для синхронизации ProjectCopy ListSyncItems
Список элементов каталога для синхронизации ProjectCopy ListSyncItems
Статистика по сущностям для синхронизации ProjectCopy ListSyncItems

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": "Документы Системы"
    }
  ]
}
Команда Путь
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
}
Команда Путь
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 созданного процесса

Команда Путь
projectcopy_CreateAndRunPlan -

CreateAndRunPlanFull

Создает и запускает полный процесс копирования проекта

Payload для команды

{
  "projectFrom": null,
  "projectTo": "project1",
  "useCache": true,
  "clearProject": true
}

Результат выполнения команды

"865b7ec2-b6f8-4a71-89fe-fbfa041360f8"

Команда возвращает ID созданного процесса

Команда Путь
projectcopy_CreateAndRunPlanFull -

CreateSyncPlans

Создает планы синхронизации для проектов

Payload для команды

{
  "projectFrom": null,
  "projectTo": ["project1", "project2"],
  "useCache": true
}

Результат выполнения команды

[
  "865b7ec2-b6f8-4a71-89fe-fbfa041360f8",
  "865b7ec2-b6f8-4a71-89fe-fbfa041360f8"
]

Команда возвращает список ID созданных процессов

Команда Путь
projectcopy_CreateSyncPlans -

RestartSyncProcess

Перезапускает существующий план синхронизации

Payload для команды

"865b7ec2-b6f8-4a71-89fe-fbfa041360f8"

Команда не возвращает данных

Команда Путь
projectcopy_RestartSyncProcess -

IsProjectEmpty

Возвращает boolean - пуст указанный проект или нет

Payload для команды

"project1"

Результат выполнения команды

true
Команда Путь
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"
}
Команда Путь
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
}
Команда Путь
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

DeleteCopyProcessesByIds

Удалить процессы копирования по id

Payload для команды

[
  "3050f39c-a691-4986-a439-69b81d4fddbb",
  "761f2028-537c-42d6-b26d-3fe12cb46331"
]

Команда не возвращает данных

Команда Путь
projectcopy_DeleteCopyProcessesByIds -

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",
      "totalCount": 10,
      "completedCount": 9,
      "errorCount": 1
    },
    {
      "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,
      "totalCount": 10,
      "completedCount": 10,
      "errorCount": 0
    }
  ],
  "total": 2
}
Команда Путь
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
}

Команда не возвращает данных

Команда Путь
projectcopy_ProcessDiffs -

Получить список связей коллекций

Payload для команды

{
  "project": "project1",
  "collectionType": "entities",
  "collectionCodes": ["Documents_0D33"]
}

Результат выполнения команды

[
  {
    "collectionCode": "Documents_0D33",
    "links": [
      {
        "collectionCode": "Documents_0D33",
        "project": "project2"
      }
    ]
  }
]
Команда Путь
projectcopy_ListCollectionLinks -

Получить список связей элементов коллекции

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"
      }
    ]
  }
]
Команда Путь
projectcopy_ListCollectionItemLinks -

MapEntity

Трансформировать сущность межпроектными связями

Payload для команды

{
  "collectionType": "generationRuleSets",
  "data": {}
}

Результат выполнения команды

{
  "data": {},
  "warning": false
}
Команда Путь
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"
]
Команда Путь
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"
            }
          ]
        }
      ]
    }
  ]
}
Команда Путь
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": []
  }
]
Команда Путь
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
}
Команда Путь
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
}
Команда Путь
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"
      }
    ]
  }
]
Команда Путь
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:

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 нет Сообщение об ошибке
totalCount Int да Общее кол-во копируемых объектов
completedCount Int да Кол-во скопированных объектов
errorCount Int да Кол-во объектов, копирование которых завершилось с ошибкой

Возможные значения status:

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[] да Коды коллекций
Поле Тип Обязательное Описание
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:

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:

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:

CatalogModelChange

Поле Тип Обязательное Описание
id uuid да ID изменения
status DiffStatusEnum да Статус изменения
diffType string да Тип изменения
before json да Предыдущее значение
after json да Новое значение
previouslyRejected boolean да Ранее отклоненное изменение
syncErrors SyncErrorEnum[] да Ошибки синхронизации

Возможные значения diffType:

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:

Тип before/after - String

Тип before/after - String

Тип before/after - String

Тип 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:

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:

Тип before/after - Int

Тип 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 да Зависящие от этого изменения
Поле Тип Обязательное Описание
id string да ID объекта
links CollectionItemLinkListItem да Связи с другими проектами

CollectionItemLinkListItem

Поле Тип Обязательное Описание
id string да ID объекта
project string нет Код проекта

CollectionTypeEnum:

Возможные значения:

ModeEnum:

Возможные значения:

DiffStatusEnum

Возможные значения:

SyncErrorEnum

Возможные значения:

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

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Список переменных окружения сервиса 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 доступны для использования в настройке авторизации.

Если указан прочерк "-", то данное значение не влияет на авторизацию:

Назначение команды Имя вызова команды 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": {
    "defaultStatistic": true,
    "charts": [
      {
        "code": "first",
        "chartType": "pie",
        "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"
              }
            ]
          }
        ]
      }
    ]
  }
}

На выходе ID шаблона

"5304f635-b591-4868-9a3d-7bb582a7e990"

Создает новый шаблон статистики

Имя вызова команды: statistics_CreateStatisticsTemplate.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.

UpdateStatisticsTemplate

На входе параметры шаблона

{
  "id": "5304f635-b591-4868-9a3d-7bb582a7e990",
  "title": "Название шаблона",
  "description": "Описание шаблона",
  "config": {
    "defaultStatistic": true,
    "charts": [
      {
        "code": "first",
        "chartType": "pie",
        "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"
              }
            ]
          }
        ]
      }
    ]
  }
}

Команда не возвращает данных

Обновляет шаблон статистики

Имя вызова команды: statistics_UpdateStatisticsTemplate.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.

DeleteStatisticsTemplate

На входе ID шаблона

"5304f635-b591-4868-9a3d-7bb582a7e990"

Команда не возвращает данных

Удаляет шаблон статистики

Имя вызова команды: statistics_DeleteStatisticsTemplate.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.

GetStatisticsTemplate

На входе ID шаблона

"5304f635-b591-4868-9a3d-7bb582a7e990"

На выходе шаблон

{
  "id": "5304f635-b591-4868-9a3d-7bb582a7e990",
  "title": "new",
  "description": "new",
  "config": {
    "defaultStatistic": true,
    "charts": [
      {
        "code": "first",
        "chartType": "pie",
        "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"
              }
            ]
          }
        ]
      }
    ]
  },
  "created": 1756975661831,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1756975661831,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "context": null
}

Возвращает шаблон статистики

Имя вызова команды: statistics_GetStatisticsTemplate.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

ListStatisticsTemplates

На входе параметры поиска

{
  "query": "",
  "context": {}
}

На выходе список шаблонов

{
  "items": [
    {
      "id": "5304f635-b591-4868-9a3d-7bb582a7e990",
      "title": "new",
      "description": "new",
      "config": {
        "defaultStatistic": true,
        "charts": [
          {
            "code": "first",
            "chartType": "pie",
            "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"
                  }
                ]
              }
            ]
          }
        ]
      },
      "created": 1756975661831,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1756975661831,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "context": null
    }
  ],
  "total": 1
}

Возвращает шаблон статистики

Имя вызова команды: statistics_GetStatisticsTemplates.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
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",
      "chartType": "pie",
      "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",
      "chartType": "pie",
      "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.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

CalculateTableStatistics

На входе параметры расчета

{
  "charts": [
    {
      "code": "first",
      "chartType": "pie",
      "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",
      "chartType": "pie",
      "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.
Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

Возможные значения businessError:

DownloadTableStatistics

На входе параметры расчета

{
  "charts": [
    {
      "code": "first",
      "chartType": "pie",
      "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",
      "chartType": "pie",
      "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.
Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.

Возможные значения businessError:

Модели сервиса 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 Да Код графика
chartType String Да Тип графика
title String Да Название графика
entityType String Да Код сущности
limit Int Нет Ограничение количества значений
groupInRest Boolean Нет Отображать остаток
filtering Search Нет Фильтры сущности
aggregation StatisticsChartAggregation Да Параметры агрегации
dependencies StatisticsChartDependency[] Да Зависимости от других графиков

StatisticsChartAggregation

Поле Тип Обязательное Описание
aggregationType String Да Тип агрегации
exactValue Json Нет Значение для агрегации по конкретному значению
optionsTitles StatisticsChartOptionsTitles Нет Текстовые значения для агрегации по конкретному значению
attributePath StatisticsAttributePath[] Да Путь до поля

Возможные значения aggregationType:

StatisticsChartOptionsTitles

Поле Тип Обязательное Описание
successTitle String Да Текстовое значение для существующего/указанного значения
failureTitle String Да Текстовое значение для несуществующего/другого значения

StatisticsAttributePath

Поле Тип Обязательное Описание
fieldCode String Да Код поля
fieldType String Да Тип поля
entityType String Нет Код сущности (для fieldType=entityObject)
catalogCode String Нет Код каталога (для fieldType=catalogItem)

Возможные значения fieldType:

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:

StatisticsTemplateCreateDTO

Поле Тип Обязательное Описание
title string Да Название шаблона
description string Нет Описание шаблона
config StatisticsTemplateConfig Да Настройки шаблона

StatisticsTemplateUpdateDTO

Поле Тип Обязательное Описание
id uuid Да ID шаблона
title string Да Название шаблона
description string Нет Описание шаблона
config StatisticsTemplateConfig Да Настройки шаблона

StatisticsTemplate

Поле Тип Обязательное Описание
id uuid Да ID шаблона
title string Да Название шаблона
description string Нет Описание шаблона
config StatisticsTemplateConfig Да Настройки шаблона
created timestamp Да Дата создания шаблона
createdBy uuid Нет ID пользователя, создавшего шаблон
modified timestamp Да Дата изменения шаблона
modifiedBy uuid Нет ID пользователя, изменившего шаблон
context string Нет Контекст шаблона

StatisticsTemplateConfig

Поле Тип Обязательное Описание
defaultStatistic boolean Да ID шаблона
charts StatisticsChart Да Список графиков

VNP-control: сервис спец команд проекта DYG

Сервис подготавливает данные для построения деревьев ВНП Команды могут приходить как по HTTP, так и через Kafka в топик vnpcontrol_commands.

В сервисе реализованы следующие команды:

Optimistic Lock

У нескольких команд реализован механизм оптимистичных блокировок. Для этого в данных присутствует поле version. Задача оптимистичных блокировок - предотвратить одновременное редактирование объекта из двух открытых форм. Сначала фронтэнд запрашивает данные объекта и получает в ответе версию данных - поле version. Он прикладывает эту версию в ответе. Если на бэкэнде она совпадает с исходной (не было других модификаций), тогда данные сохраняются, а версия поднимается. Иначе сохранения не происходит, данные не перетираются.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Конфигурирование

Требования к запуску

Запуск сервиса осуществляется локально через 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_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_TTL duration string Нет 10 minutes TTL результата построения дерева иерархии в кэше
VNPCONTROL_HIERARCHY_PROCESSING_CACHE_TTL duration string Нет 1 minute TTL результата построения дерева иерархии в кэше (для одновременных запросов)
VNPCONTROL_HIERARCHY_MAXIMUM_TREE_SIZE int Нет 50000 Максимальный размер дерева иерархий
VNPCONTROL_OBERTO_BATCH_SIZE int Нет 30 Максимальное количество политик в рамках одного вызова команды

Список команд сервиса 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,
  "overrideLimit": 10000
}

Результат выполнения команды

{
  "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,
        "entityObjectWithDuplicateWarningCount": 0,
        "childrenWithLowWarningCount": 5,
        "childrenWithCriticalWarningCount": 6,
        "childrenWithDuplicateWarningCount": 0,
         "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
    }
  ],
  "limitReached": false,
  "limit": 100000
}

Команда отображения полного дерева ВНП. Без предварительной генерации строить дерево по данным [hierarchyEntity -> data]*2.
Не все настройки генерации передаются со входными данными, часть так же указана в поле иерархии data -> HierarchyData.Settings.

  1. Опциональные параметры baseEntityFilterField*. Для фильтрации базовой сущности можно применить атрибут её модели данных и предполагаемое значение. Правила заполнения аналогичны работе с Search, но только по одному атрибуту.
Команда Путь
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": {
        "config": [
          {
            "nodeType": "entityObject",
            "codeSourceFieldCode": "field",
            "entityType": "entityType",
            "fields": [

            ],
            "restrictedFields": [],
            "children": [],
            "multipleInsert": true,
            "addRemainingNode": true,
            "tagFilterFieldCode": "tag",
            "nodeId": "some-id",
            "showCode": true
          }
        ],
        "settings": {
          "baseTree": true
        }
      },
      "created": 1736862738971,
      "createdBy": "837068a9-1e9c-4326-a449-5c830c0115fd",
      "modified": 1736930690417,
      "modifiedBy": "837068a9-1e9c-4326-a449-5c830c0115fd",
      "version": 8
    }
  ],
  "total": 1
}

Получение списка иерархичных сущностей с поиском, сортировкой и пагинацией.

Команда Путь
vnpcontrol_listHierarchyEntities HTTP POST "/v1/hierarchyEntity/list"

GetHierarchyEntity

Payload для команды

"HierarchyEntityId"

Результат выполнения команды

{
  "id": "HierarchyEntityId",
  "title": "title",
  "description": "description",
  "data": {
    "config": [
      {
        "nodeType": "entityObject",
        "codeSourceFieldCode": "field",
        "entityType": "entityType",
        "fields": [

        ],
        "restrictedFields": [],
        "children": [],
        "multipleInsert": true,
        "addRemainingNode": true,
        "tagFilterFieldCode": "tag",
        "nodeId": "some-id",
        "showCode": true
      }
    ],
    "settings": {
      "baseTree": true
    }
  },
  "created": 1664292962695,
  "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "modified": 1664292962695,
  "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "version": 2
}

Получение иерархичной сущности.

Команда Путь
vnpcontrol_getHierarchyEntity HTTP POST "/v1/hierarchyEntity/get"

CreateHierarchyEntity

Payload для команды

{
  "id": "HierarchyEntityId",
  "title": "title",
  "description": "description",
  "data": {
    "config": [
      {
        "nodeType": "entityObject",
        "codeSourceFieldCode": "field",
        "entityType": "entityType",
        "fields": [

        ],
        "restrictedFields": [],
        "children": [],
        "multipleInsert": true,
        "addRemainingNode": true,
        "tagFilterFieldCode": "tag",
        "nodeId": "some-id",
        "showCode": true
      }
    ],
    "settings": {
      "baseTree": true
    }
  },
  "externalType": "catalogItem",
  "externalEntityType": "CatalogCode1",
  "externalId": "6d873b43-0913-4fde-827c-968f13ebf778"
}

Результат выполнения команды

"HierarchyEntityId"

Добавление новой иерархичной сущности.

Команда Путь
vnpcontrol_createHierarchyEntity -

UpdateHierarchyEntity

Payload для команды

{
  "id": "HierarchyEntityId",
  "title": "title",
  "description": "description",
  "data": {
    "config": [
      {
        "nodeType": "entityObject",
        "codeSourceFieldCode": "field",
        "entityType": "entityType",
        "fields": [

        ],
        "restrictedFields": [],
        "children": [],
        "multipleInsert": true,
        "addRemainingNode": true,
        "tagFilterFieldCode": "tag",
        "nodeId": "some-id",
        "showCode": true
      }
    ],
    "settings": {
      "baseTree": true
    }
  },
  "version": 1
}

Результат выполнения команды

true

Обновление иерархичной сущности.

Команда Путь
vnpcontrol_updateHierarchyEntity -

DeleteHierarchyEntity

Payload для команды

"hierarchyEntityId"

Результат выполнения команды

true

Удаление иерархичной сущности.

Команда Путь
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
}

Возвращает список всех конфигураций проекта. Поддерживается только синхронный вызов.

Команда Путь
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
}

Поиск конфигурации проекта с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
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). Поддерживается только синхронный вызов.

Команда Путь
vnpcontrol_GetProjectConfigInfrastructureInfo HTTP POST "/v1/projectConfig/listInfrastructure"

ListUserProjects

Payload для команды

{}

Результат выполнения команды

[
  "project1",
  "project2"
]

Список id проектов, доступных текущему пользователю. Поддерживается только синхронный вызов.

Команда Путь
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"

Добавляет новую конфигурацию проекта с заданными параметрами. Отправляет событие о создании конфигурации проекта.

Команда Путь
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

Обновляет данные о конфигурации проекта. Отправляет событие об обновлении конфигурации проекта.

Команда Путь
vnpcontrol_UpdateProjectConfig -

DeleteProjectConfig

Payload для команды

"some-id"

Результат выполнения команды

true

Удаляет конфигурацию проекта с заданным идентификатором. Отправляет событие об удалении проекта конфигурации.

Команда Путь
vnpcontrol_DeleteProjectConfig -

ClearProject

Payload для команды

"project1"

Команда не возвращает данных

Производит полную очистку проекта

Команда Путь
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
}

Возвращает список всех конфигураций проекта. Поддерживается только синхронный вызов.

Команда Путь
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
}

Получение набора правил генерации сущностей с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
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"

Добавляет новый набор правил генерации сущностей с заданными параметрами. Отправляет событие о создании набора правил генерации сущностей.

Команда Путь
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

Обновляет данные о наборе правил генерации сущностей. Отправляет событие об обновлении набора правил генерации сущностей.

Команда Путь
vnpcontrol_UpdateGenerationRuleSet -

DeleteGenerationRuleSet

Payload для команды

"some-id"

Результат выполнения команды

true

Удаляет набор правил генерации сущностей с заданным идентификатором. Отправляет событие об удалении набора правил генерации сущностей.

Команда Путь
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 задачи на генерацию (для отмены задачи) и реестра сгенерированных сущностей (пока не поддерживается)

Команда Путь
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
}

Возвращает список всех правил нумерации сущностей. Поддерживается только синхронный вызов.

Команда Путь
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
}

Получение правила нумерации сущностей с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
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"

Добавляет новое правило нумерации сущностей с заданными параметрами. Отправляет событие о создании правила нумерации сущностей.

Команда Путь
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

Обновляет данные о правиле нумерации сущностей. Отправляет событие об обновлении правила нумерации сущностей.

Команда Путь
vnpcontrol_UpdateNumerationRule -

DeleteNumerationRule

Payload для команды

"some-id"

Результат выполнения команды

true

Удаляет правило нумерации сущностей с заданным идентификатором. Отправляет событие об удалении правила нумерации сущностей.

Команда Путь
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 задачи на генерацию (для отмены задачи)

Команда Путь
vnpcontrol_ExecuteNumeration -

ListValueGenerationRule

Возвращает список всех правил формирования значения атрибута сущностей. Поддерживается только синхронный вызов.

Команда Путь
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
}

Получение правила формирования значения атрибута сущностей с заданным идентификатором. Поддерживается только синхронный вызов.

Команда Путь
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"

Добавляет новое правило формирования значения атрибута сущностей с заданными параметрами. Отправляет событие о создании правила формирования значения атрибута сущностей.

Команда Путь
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

Обновляет данные о правиле формирования значения атрибута сущностей. Отправляет событие об обновлении правила формирования значения атрибута сущностей.

Команда Путь
vnpcontrol_UpdateValueGenerationRule -

DeleteValueGenerationRule

Payload для команды

"some-id"

Результат выполнения команды

true

Удаляет правило формирования значения атрибута сущностей с заданным идентификатором. Отправляет событие об удалении правила формирования значения атрибута сущностей.

Команда Путь
vnpcontrol_DeleteValueGenerationRule -

GenerateValueByAttributes

Payload для команды

{
  "valueGenerationRuleId": "49b027c6-50b7-3219-a8f0-72746d2a25b7",
  "attributes": {
    "field1": "value1",
    "field2": "value2",
    "field3": "value3"
  }
}

Результат выполнения команды

"value1-value2.value3"

Генерирует строку на основание правила и переданных атрибутов объекта.

Команда Путь
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 задачи на генерацию (для отмены задачи)

Команда Путь
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.

Команда Путь
vnpcontrol_CheckValueGenerationForEntities -

ChangeWarningStatus

Payload для команды

{
  "objectId": "784eee29-e1a6-4f57-8e45-b4fd469d6658",
  "entityType": "Tag",
  "fieldCode": "complex",
  "warningType": "autofillCurrentValueNotValid",
  "status": "Inactive"
}

Результат выполнения команды

true

Смена состояния Warning-ов в метаданных сущности.

Поддерживается только синхронный вызов.

Команда Путь
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
}

Возвращает список генераций. Поддерживается только синхронный вызов.

Команда Путь
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
}

Получение карточки генерации. Поддерживается только синхронный вызов.

Команда Путь
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%). По окончанию работы статистика пропадает и нужно смотреть статус у записи журнала генерации.

Поддерживается только синхронный вызов.

Команда Путь
vnpcontrol_GenerationProgress -

EditPolicySectionGroups

Payload для команды

{
   "code": "Section1",
   "groups": [
      "admins"
   ]
}

Команда не возвращает данных

Обновить список групп раздела прав

Команда Путь
vnpcontrol_EditPolicySectionGroups -

EditGroupPolicySections

Payload для команды

{
   "group": "admins",
   "policySectionCodes": ["section1", "section2"]
}

Команда не возвращает данных

Обновить список разделов прав у группы

Команда Путь
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
}

Получить список разделов прав

Поддерживается только синхронный вызов.

Команда Путь
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
   }
]

Получить список разделов прав

Поддерживается только синхронный вызов.

Команда Путь
vnpcontrol_GroupPolicySectionsCount -

AutofillValueForEntities

Payload для команды

{
   "entityType": ["System", "Document"],
   "search": {
      "query": "",
      "context": {}
   }
}

Результат выполнения команды

{
   "successEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"],
   "failureEntities": ["d40a62c9-2fd6-470a-a595-1535a0cc262c"]
}

Запустить процесс автозаполнения полей для указанных сущностей

Команда Путь
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"]
}

Запустить процесс поиска дублей объектов по полям сущности, добавление специальных ворнингов для таких объектов.

Команда Путь
vnpcontrol_CheckDuplicatesForEntities -

GenerateUiForms

Payload для команды

{
   "entityTypeId": "FormTesting",
   "formCodes": ["card", "list", "createForm", "editForm", "filterPanel"],
   "addClassificationBlock": false
}

Команда не возвращает данных

Сгенерировать визуальные формы для сущности

Команда Путь
vnpcontrol_GenerateUiForms -

Модели сервиса VNP-control

ListVnpHierarchyDto

Поле Тип Обязательное Описание
hierarchySearch HierarchySearch да Параметры запроса для дерева иерархий
hierarchyCode String да Идентификатор сущности иерархии
useCache Boolean да Использовать кэш
overrideLimit Int нет Максимальный размер дерева. Если не задано, то используется по-умолчанию. Если 0 - то без лимита

TreeWithStatistic

Поле Тип Обязательное Описание
tree Page[HierarchyEntityObjectExtendedDto] да Обновлённое дерево с добавленными объектами на основе тегов
statistic TreeStatisticItem[] да Информация о количестве пар nodeType + entityType
limitReached Boolean да Был ли превышен лимит при построении дерева
limit Int нет Какой лимит использовался при построении. Если без лимита - то null

TreeStatisticItem

Поле Тип Обязательное Описание
nodeType String да Тип узла
entityCodeType String да Идентификатор сущности справочника
count Int да Количество узлов с таким типом и идентификатором

HierarchyEntity

Поле Тип Обязательное Описание
id string да ID
title string да имя сущности
description string да описание сущности
data HierarchyEntityData да конфиг дерева
context String нет Код проекта к которому относится объект
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
version Integer да версия для оптимистичной блокировки

HierarchyEntityCreateDto

Поле Тип Обязательное Описание
id string да ID
title string да имя сущности
description string да описание сущности
data HierarchyEntityData да конфиг дерева

HierarchyEntityUpdateDto

Поле Тип Обязательное Описание
id string да ID
title string да имя сущности
description string да описание сущности
data HierarchyEntityData да конфиг дерева
version Integer да версия для оптимистичной блокировки

HierarchyEntityData

Поле Тип Обязательное Описание
config HierarchyEntityDataConfig[] да Конфигурация вершин дерева
settings HierarchyEntityDataSettings да Настройки

HierarchyEntityDataConfig

Общие поля:

Поле Тип Обязательное Описание
nodeType NodeType да Тип вершины
fields HierarchyTreeDataField[] да Поля вершины
children HierarchyEntityDataConfig[] да Дочерние вершины
nodeId string нет ID вершины
addRemainingNode boolean нет Подсчет неформализованного остатка
multipleInsert boolean нет Использование объектов несколько раз в иерархии
showCode boolean нет Отображать шифр сущности
codeSourceFieldCode string нет Поле с шифром объекта
tagFilterFieldCode string нет Поле для фильтрации по тегам

Дополнительные поля для nodeType=entityObject:

Поле Тип Обязательное Описание
entityType string да Код типа сущности
restrictedFields HierarchyTreeDataField[] да Поля-ограничения

Дополнительные поля для nodeType=catalogItem:

Поле Тип Обязательное Описание
catalogCode string да Код каталога
restrictedFields HierarchyTreeDataField[] да Поля-ограничения
tagFilterParentPkFieldCode string нет Поле - связь с тегом (не используется)

Дополнительные поля для nodeType=tag:

Поле Тип Обязательное Описание
entityType string да Код типа сущности

Дополнительные поля для nodeType=virtualTagField:

Поле Тип Обязательное Описание
keepChildlessNode boolean нет Оставлять ли узлы без тегов (не используется)

NodeType

Возможные значения:

HierarchyTreeDataField

Поле Тип Обязательное Описание
fieldType FieldType да Тип поля
fieldCode string да Код поля
fieldEntityType string да Код сущности
parentPkFieldCode string нет Код родительской сущности

Дополнительные поля для fieldType=catalogItem:

Поле Тип Обязательное Описание
fieldCatalogCode string да Код каталога

Дополнительные поля для fieldType=numberValue:

Поле Тип Обязательное Описание
ranges NumberRange[] нет Диапазоны

FieldType

Возможные значения:

NumberRange

Поле Тип Обязательное Описание
from float нет Начало диапазона
to float нет Конец диапазона
fromExclude boolean нет Исключить начальное значение
toExclude boolean нет Исключить конечное значение

HierarchyEntityDataSettings

Поле Тип Обязательное Описание
baseTree boolean да Базовое дерево
baseEntityFilterFieldCode string нет Поле базового справочника
baseEntityFilterFieldValue json нет Значение для построения дерева
baseEntity string нет Базовый справочник
addRemainingNode boolean нет Добавление неформализованного остатка

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

Поле Тип Обязательное Описание
successEntities ObjectId Да Идентификаторы объектов Data Model для которых генерация прошла успешно
failureEntities ObjectId Да Идентификаторы объектов Data Model для которых генерация завершилась ошибкой

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 да Количество серьезных предупреждений у текущего объекта (узла)
entityObjectDuplicateWarningCount Integer да Количество дубликатов у текущего объекта (узла)
childrenWithLowWarningCount Integer да Количество несерьезных предупреждений у дочерних объектов (узлов)
childrenWithCriticalWarningCount Integer да Количество серьезных предупреждений у дочерних объектов (узлов)
childrenWithDuplicateWarningCount 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:


Примечания

*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