Журнал технических изменений

Версия 6.14

Описание ошибки импорта записей иерархического справочника

  • При возникновении ошибки импорта записей иерархического справочника формируется такое же уведомление как для реестров/справочников.

  • Возникшая ошибка логируется в журнал аудита и на ее основе строиться CSV отчет.

  • Из-за особенностей Spring AOP после добавления интерфейса CommonAuditEventFallbackSupport к XlsxHierarchyBatchInvoker стали создаваться прокси несовместимые с инъекцией по классу. Cоздан интерфейс XlsxHierarchyBatchInvoker. Существующая реализация перенесена в XlsxHierarchyBatchInvokerImpl.

Заголовок виджета "Связанные задачи/процессы" в карточке записи

Изменено название виджета задач на карточке записи.

Было - "Связанные задачи/процессы".

Стало - "Доступные задачи/процессы".

Рефакторинг дерева иерархии моделей

Проведена оптимизация дерева метамодели на странице модели данных. Был задействован механизм виртуализации, который уже использовался до этого в следующих местах:

  • Дерево записей иерархических справочников;

  • Дерево ресурсов безопасности;

  • Дерево узлов классификатора.

Использование виртуализации привело к следующим изменениям интерфейса:

  • При открытии страницы метамодели будут раскрыты только группы первого уровня.

  • Если перезагрузить страницу метамодели с выбранным реестром/справочником, то будут автоматически раскрыты все группы, которые его содержат, и будет выполнен скролл на узел этого реестра/справочника.

  • При скролле дерева и раскрытии групп было добавлено отображение состояния подгрузки узлов.

В сторы и компоненты виртуального дерева добавлены:

  • Поддержка drag & drop;

  • Возможность указывать индекс узла при перемещении;

  • Возможность редактирования полей модели узла;

  • Возможность включать режим редактирования ноды извне.

Компонент VirtualTree разбит на файлы:

  • VirtualTreeNode - логика, относящаяся непосредственно к узлу дерева.

  • VirtualTreeController - все что связано с observable-значениями.

Проведена частичная оптимизация рендеринга дерева:

  • В ScrollStore увеличен интервал между обновлением положения прокрутки.

  • Уменьшено количество ререндеров компонента Hierarchy.

  • В TreeContainer добавлен will-change: scroll-position.

Уведомление участников бизнес-процессов

Backend:

  • Модули com.unidata.mdm.subscriptions и com.unidata.mdm.rest.v1.subscriptions добавлены в сборку.

  • Реализован механизм подписок для бизнес-процессов. Добавлены классы WorkflowSubscriptionProvider, WorkflowSubscriptionTypes, WorkflowNotificationTriggers.

  • Добавлен новый тип подписки WorkflowSubscriptionTypes.WORKFLOW_TASK и новый триггер WorkflowNotificationTriggers.TASK_ASSIGNMENT.

  • Добавлен новый endpoint GET v2/workflow/task/subscribers/{taskId} – позволяет получить список подписчиков для конкретной задачи при помощи нового класса TaskAssignmentSubscriptionsResolver.

  • Класс TaskAssignNotificationListener, отвечавший за отправку уведомлений исполнителю и инициатору о назначениях задач, помечен как deprecated.

  • Теперь исполнитель и инициатор получают уведомления при помощи виртуальных подписок. Отправка уведомлений подписчикам происходит в новом классе TaskAssignmentSubscriptionsNotifier.

Frontend:

  • Добавлен модуль @universe-ee/subscriptions.

  • В модуле @universe-ee/workflow добавлен утильный класс BpmnUtil.

  • В модуле @universe-ee/workflow добавлен стор TaskSubscriptionStore, управляющий подпиской на задачу.

HashiCorp Vault

  • Добавлены инструменты для указания ссылок на свойства в backend.properties для хранения значений во внешних хранилищах, а также реализации обработчиков этих ссылок.

  • Реализован обработчик таких ссылок для хранилища HashiCorp Vault.

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

В модель БП, в структуры ProcessDefinition, ProcessDefinitionRO было добавлено поле singleFlowRestriction - признак запрета запуска нескольких процессов.

В WorkflowValidationComponent добавлен метод ensureWorkflowStartNotRestricted для проверки наличия ограничения на назначенных БП на реестр и запущенных процессов при старте БП.

Для поиска запущенных процессов был добавлен новый REST GET api/v2/workflow/process/{count-active}/{subjectNamespace}/{subjectEntity}/{subjectId}, где subjectId - эталонный ключ записи, subjectEntity - имя реестра/справочника записи, subjectNamespace - namespace сущности (lookup/register для МДМ). Запрос возвращает структуру ActiveSubjectProcessInstancesRO, которая содержит в себе счетчик всех запущенных процессов и список ActiveProcessInstancesInfoRO, содержащий в себе: processName - системные имена процессов, processDisplayName - отображаемые имена, version - версии, activeInstances - кол-во запущенных процессов по этой записи и флаг unique, отображающий наличие признака запрета у этого БП.

WorkflowProcessService был расширен методом SubjectProcessInstancesInfo getProcessInstancesForSubject(String namespace, String subjectEntity, String subjectId) для получения информации о запущенных процессах субъекта из назначенных на сущность.

Добавлен механизм запрета множественного согласования по бизнес-процессам.

В структуре ответа ProcessDefinitionRO было добавлено поле singleFlowRestriction.

Перед запуском БП добавлена проверка на запрет множественного согласования.

Добавлен новый REST GET api/v2/workflow/process/{subjectId}/{subjectEntity} для получения информации о запущенных процессах.

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

  • Изменилась логика заполнения истории записи.

  • Изменилась логика применения типа операции.

Улучшено поведение при удалении/восстановлении и упорядочен лог записи для действий удаления и восстановления для связей/классификации.

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

Операция восстановления связей / классификации сохранилась, но только как часть операции восстановления записи.

Техническая информация по использованию operation_type:

  • Если связь или классификация удаляются пользователем явно, то их последний сохраненный тип операции будет DIRECT.

  • Если связь или классификация удаляются в результате удаления родительской записи, то их последний сохраненный тип операции будет CASCADE.

  • Если запись восстанавливается целиком, то будут восстановлены только те связи и классификации, которые имеют тип последней операции CASCADE. Их сообщения, как и прежде, будут "Восстановление записи" / "Восстановление классификации".

  • Если связь или классификация создаются вновь и у записи уже существовала связь такого же типа с такой же целевой записью / классификация тем же узлом, которая была удалена ранее, физическая запись связи / классификации инициализируется заново, ее старые ревизии удаляются, а счетчик ревизий вновь стартует с первой. Сообщения в истории записи аналогичны сообщениям при создании связи / классификации - "Инициализация источника данных связи" или "Инициализация источника данных классификации". Даты создания связи / классификации в БД при этом не меняются. Предыдущая трактовка такого действия была "восстановление".

Последний тип операции связи / классификации можно посмотреть в таблице эталонов соответствующего типа в колонке operation_type.

Корректировка детализации события assign-task в журнале аудита

Изменен текст деталей сообщений журнала аудита для назначений/отмены назначений.

Сообщения о назначении разбиты на 2 типа:

  • Сообщение об успешном назначении теперь содержит в деталях: ID задачи: {0}; Наименование задачи: {1}. Задача успешно назначена на пользователя {2}.

  • Сообщение о провале назначения содержит в деталях: ID задачи: {0}; Наименование задачи: {1}. Не удалось выполнить назначение задачи пользователю {2}. Лог системы может содержать дополнительные данные.

Сообщение об отмене назначения (unassign) содержит разные детали в зависимости от успеха операции:

  • Сообщение об успешном назначении теперь содержит в деталях: ID задачи: {0}; Наименование задачи: {1}. Снятие назначения выполнено успешно.

  • Сообщение о провале назначения содержит в деталях: ID задачи: {0}; Наименование задачи: {1}. Не удалось снять назначение. Лог системы может содержать дополнительные данные.

Значение по умолчанию в атрибутах типа "Ссылка на справочник"

Включение значения по умолчанию в атрибутах типа "Ссылка на справочник" реализуется с помощью параметра ENABLE_EXPERIMENTAL_LOOKUP_ATTRIBUTE_DEFAULT_VALUE в customer.json. Значения по умолчанию на странице мета-модели будет отображаться при установке флага в значение true.

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

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

Пример заполнения атрибута:

  {
 "base": true,
 "ownerAssetType": "assetTypeWithAllAttr",
 "dictionaryDataType": [],
 "defaultUnitId": null,
 "displayable": true,
 "enumDataType": "",
 "linkDataType": "",
 "lookupEntityCodeAttributeType": "String",
 "lookupEntityDisplayAttributes": [],
 "lookupEntitySearchAttributes": [],
 "lookupEntityType": "country",
 "lookupIsHierarchical": false,
 "mainDisplayable": false,
 "nullable": true,
 "searchable": true,
 "searchCaseInsensitive": false,
 "searchMorphologically": false,
 "searchWithTransliteration": false,
 "searchWithSynonyms": false,
 "searchCustomSort": null,
 "simpleDataType": "",
 "valueId": null,
 "unique": false,
 "securitySensitive": false,
 "useAttributeNameForDisplay": false,
 "largeObjectProvider": null,
 "largeObjectContainer": null,
 "name": "link",
 "displayName": "Link",
 "description": "у",
 "readOnly": false,
 "hidden": false,
 "order": 4,
 "defaultValue": null,                                                 // для атрибутов типа "ссылка на справочник" тут заполняется кодовый атрибут соответствующего справочника
 "obfuscationFunction": null,
 "generationStrategy": null,
 "rights": null,
 "tags": [],
 "customProperties": []
}

Получение отображаемого значения перечисления по кодовому значению

В библиотеку data-cleanse-functions.jar была добавлена новая функция FetchEnumerationValue.

Инструмент отслеживания переназначения задач

Для доступа к истории назначений реализован эндпоинт – POST /universe-backend/api/v2/workflow/task-assignment-history/

Запрос:

{
 "taskId": "382", /* Идентификатор задачи */
 "events": ["ASSIGN", "REASSIGN", "UNASSIGN"], /* Фильтр по событиям (опционально) */
 "limit": 100, /* Количество элементов (опционально) */
 "offset": 0, /* Смещение элементов (опционально) */
 "ascending": false /* Сортировка от самых новых элементов (false) или наоборот (true) */
}

Ответ:

{
 "elements": [
     {
         "taskId": "382",
         "processInstanceId": "361",
         "assignee": "user",
         "initiator": "user",
         "event": "REASSIGN",
         "timestamp": "2025-08-27T10:28:03.490Z"
     },
     {
         "taskId": "382",
         "processInstanceId": "361",
         "assignee": "admin",
         "initiator": "admin",
         "event": "ASSIGN",
         "timestamp": "2025-08-27T10:27:51.163Z"
     }
   ]
}

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

Frontend:

  • ReadTaskAssignmentHistoryOp - Добавлен API для получения истории назначений задач.

  • AssignmentHistoryStore - Добавлен стор для истории назначений.

  • HistoryRow - Реализована новая логика вывода истории назначений.

Backend:

  • Добавлена таблица com_unidata_mdm_workflow_core.task_assignment_history и реализован API для работы с ней (TaskAssignmentHistoryDAO, TaskAssignmentHistoryService, TaskAssignmentHistoryRestService и др.).

  • WorkflowTaskAssignContext дополнен полями processInstanceId, initiator, event и timestamp.

ETL: типы сообщений

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

Для Upsert операций остался процессор DataRecordMessageProcessor, для Restore был реализован RestoreRecordMessageProcessor, для Delete - DeleteRecordMessageProcessor. Процессоры отвечают именно за обработку уже собранных сообщений, работают через сервис MetaDrivenManagerService.

Добавлена поддержка отправки сообщений по типам операции:

Модуль recipient расширен классами RestoreRecordMessageProcessor, DeleteRecordMessageProcessor, InputMessageConverter, InputMessageAggregator, InputMessageDynamicRouter.

Мониторинг

Добавлены новые запросы:

  • GET /v1/monitoring-core/static/metrics - получение всех статических метрик.

  • GET /v1/monitoring-core/static/metrics/{name} - получение одной статической метрики по имени.

Добавлены новые параметры системы:

  • Включить логирующую систему мониторинга (отключено по умолчанию, доступно для редактирования на UI) com.universe.mdm.monitoring.core.logging.registry.enabled = ${MONITORING_LOGGING_REGISTRY_ENABLED:false}

  • Частота чтения метрик логирующей системой мониторинга (в секундах, по умолчанию 60 секунд, доступно только для чтения на UI) com.universe.mdm.monitoring.core.logging.registry.step = ${MONITORING_LOGGING_REGISTRY_STEP:60}

  • Включить динамические метрики JVM (отключено по умолчанию, доступно только для чтения на UI) com.universe.mdm.monitoring.core.jvm.metrics.enabled = ${MONITORING_JVM_METRICS_ENABLED:false}

  • Включить динамические метрики логирования (отключено по умолчанию, доступно только для чтения на UI) com.universe.mdm.monitoring.core.logging.metrics.enabled = ${MONITORING_LOGGING_METRICS_ENABLED:false}

  • Включить динамические метрики Tomcat (отключено по умолчанию, доступно только для чтения на UI) com.universe.mdm.monitoring.core.tomcat.metrics.enabled = ${MONITORING_TOMCAT_METRICS_ENABLED:false}

  • Включить динамические метрики системы (отключено по умолчанию, доступно только для чтения на UI) com.universe.mdm.monitoring.core.system.metrics.enabled = ${MONITORING_SYSTEM_METRICS_ENABLED:false}

Frontend:

  • Был расширен интерфейс User-Exit-а UEDataPageWidgetMeta - были добавлены необязательные поля принадлежности виджета к группе/подгруппе. Для регистрации группподгрупп виджетов реализован DataPageWidgetManager. Все изменения поддержаны в SDK.

  • В NamespaceManager добавлены методы регистрации и получения иконки для конкретного пространства имен.

Backend:

  • Удалена метрика "http.requests.count" (счетчик), т.к. его весь его функционал выполняется метрикой "http.requests.time" (таймер).

  • В аудит в событие login_event ("Вход") добавлен параметр role_name, содержащий роли пользователя в момент входа (параметр отсутствует на UI, используется на бэкенде для фильтра по ролям в графике уникальных пользователей).

  • В индексацию задач добавлено поле $assignee_role, содержащее имена ролей пользователя, назначенного на задачу.

Обновление API

  • Был добавлен новый REST endpoint GET api/v2/data/records/check/{sourceSystem}/has-data, который проверяет, есть ли записи от переданной системы источника. Возвращает объект DataPresenceResultRO с полем hasData, значение true - ориджины от переданной СИ существуют, false - нет. Учитываются также логически удаленные ориджины.

  • В DataModelRollbackService#rollbackModel был добавлен функционал удаления сущностей при откате модели данных к той ревизии, где этих сущностей нет.

  • POST /universe-backend/api/v2/core/user-defined-properties/export – экспорт дескрипторов пользовательских параметров в JSON файл.

  • POST /universe-backend/api/v2/core/user-defined-properties/import – импорт дескрипторов пользовательских параметров из JSON файла.

Удалено API, помеченное как deprecated в 6.12:

  • Метод JobParameterDescriptor#defaultCustom(Map<String, X>);

  • Метод XLSXProcessor#convertToDate(Cell, FormulaEvaluator, SimpleDataType);

  • Класс org.unidata.mdm.data.service.segments.records.CommonAuditEventFallbackSupport;

  • Класс DataQualityCleanseFunctionComponent;

  • Эндпоинт v2/data/records/delete (DataRecordsRestService#deleteEntity(DeleteRecordRequestRO));

  • Эндпоинт v2/data/relations/relation-bulk/{id}/{name} (DataRelationsRestService#getRelationsByRecordEtalonIdAndBoundary(String, String, String, String, String, long, boolean, List<String>, boolean, boolean, boolean, int, int)).

Обновление зависимостей

  • В модуль v1 metadriven были добавлены 3 новых эндпоинта для получения точных схем объектов ввода-вывода для запросов metadriven:

  • GET /meta-data-driven/v1/schema/exact/input/{entity-name} - запрос для получения схем объектов ввода по имени сущности.

  • GET /meta-data-driven/v1/schema/exact/output/{entity-name} - запрос для получения схем объектов вывода.

  • GET /meta-data-driven/v1/schema/exact/types/{type-name}/{entity-name} - запрос для получения схем объекта ввода/вывода по типу и имени сущности.

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

  • Обновлена библиотека commons-beanutils с версии 1.9.4 до 1.11.0.

  • Обновлена библиотека logback с версии 1.4.14 до 1.5.13. Так же в конфигурации logback.xml обновился класс SizeAndTimeBasedFNATP на SizeAndTimeBasedFileNamingAndTriggeringPolicy, так как он был переименован в logback 1.5.8. Конфигурации со старым классом работать не будут.

  • Обновлена библиотека spring-ldap-core с версии 2.4.1 до версии 2.4.4.

  • Обновлены библиотеки org.apache.poi (poi, poi-ooxml, poi-ooxml-lite) с версий 5.2.5 до версий 5.4.1.

  • Обновлены библиотеки org.apache.camel:

  • camel-core

  • camel-core-xml

  • camel-xml-jaxb-dsl

  • camel-spring

  • camel-spring-xml

  • camel-management

  • camel-jmx

  • camel-jms

  • camel-mail

  • camel-velocity

  • camel-http

  • camel-kafka

С версии 3.22.1 до версии 3.22.4.

  • Был добавлен новый REST endpoint GET api/v2/data/records/check/{sourceSystem}/has-data который проверяет, есть ли записи от переданной системы источника. Возвращает объект DataPresenceResultRO с полем hasData, значение true - ориджины от переданной СИ существуют, false - нет. Учитываются также логически удаленные ориджины.

  • Был добавлен параметр системы org.universe.mdm.marks.enabled.components, который регулирует какие функциональные компоненты модуля org.universe.mdm.marks включены. Значение параметра - набор компонентов через запятую. Допустимые значения: scores, tags, comments. По умолчанию включены все компоненты, для MDM в backend.properties переопределено на comments, потому что используются только комментарии в бизнес-процессах: org.universe.mdm.marks.enabled.components = ${MDM_MARKS_ENABLED_COMPONENTS:comments}

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

  • QualityDraftPublishAccessExecutor - поинт для проверки прав доступа при публикации к изменяемым частям модели правил качества id: "org.unidata.mdm.dq.core[QUALITY_DRAFT_PUBLISH_ACCESS]", в пайплайне org.unidata.mdm.dq.core[QUALITY_DRAFT_PUBLISH_START].

  • WorkflowModelDraftPublishAccessExecutor - поинт для проверки прав доступа к публикации модели бизнес-процессов. id :"com.unidata.mdm.workflow.core[MODEL_DRAFT_PUBLISH_ACCESS]", пайплайн com.unidata.mdm.workflow.core[MODEL_DRAFT_PUBLISH_START].

  • MatchingDraftPublishAccessExecutor - поинт для проверки прав доступа к публикации модели сопоставления. id :"org.unidata.mdm.matching.core[MATCHING_DRAFT_PUBLISH_ACCESS]", пайплайн org.unidata.mdm.matching.core[MATCHING_DRAFT_PUBLISH_START].

Был добавлен поинт проверки прав доступа к изменению/созданию черновика модели сопоставления MatchingDraftUpsertAccessExecutor, id: "org.unidata.mdm.matching.core[MATCHING_DRAFT_UPSERT_ACCESS]", в пайплайн org.unidata.mdm.matching.core[MATCHING_DRAFT_UPSERT_START].

Другие, пришедшие из DG, поинты проверки прав доступа к изменению/созданию черновиков моделей также были добавлены в соответствующие пайплайны DRAFT_UPSERT

Для модели DQ был добавлен ресурс для редактирования и чтения фаз org.unidata.mdm.dq.core.security.phases_management. В поинты добавлена проверка наличия прав на редактирование фаз при наличии изменений в них.

В QualityRuleRestService к методам изменения/получения фаз была добавлена аннотация @PreAuthorize для проверки прав.

Затронутые эндпоинты:

  • GET v2/data-quality/quality-rules/phases

  • GET v2/data-quality/quality-rules/phases/{id}

  • POST v2/data-quality/quality-rules/phases

  • PUT v2/data-quality/quality-rules/phases/{id}

  • DELETE v2/data-quality/quality-rules/phases/{id}

Реализована возможность конфигурировать размер кучи JVM для Docker через переменные окружения:

  • UNIVERSE_XMS – начальный размер кучи;

  • UNIVERSE_XMX – максимальный размер кучи.

Допустимые форматы значений соответствуют документации Java (параметры -Xms и -Xmx).

Классы, методы и поля назначенные к удалению в 6.15:

  • class EmailNotificationTaskEventListener

  • SubscriptionsServiceImpl#create(SubscriptionUpsertContext)

  • SubscriptionsServiceImpl#update(SubscriptionUpsertContext)

  • GetUsersGroupResultRO#users

  • JobService#upsertJobTrigger(JobTrigger)

  • JobServiceImpl#upsertJobTrigger(JobTrigger)

  • UserRolesProvider#roles(String)

  • UserRolesProvider#users(Collection<String>)

  • IndexRefreshAwareContext#refreshIndex

  • class SystemRuntimeException

  • class DataRelationsServiceImpl

  • class MetaModelImportEvent

  • interface ExecutionContext

  • enum SearchRequestOperator

  • enum SearchRequestType

  • RecordIdentityContext#getOriginKey

  • RecordIdentityContext#isOriginRecordKey

  • RelationIdentityContext#getRelationOriginKey

  • RelationIdentityContext#isRelationOriginKey

  • UpsertRequestContext#isOriginRecordKey

  • MetaModelGraphComponent#processMeasurements

  • EnumerationModelUtils#createEnumerationMap

  • SetPasswordRequestRO#userName

  • RoleDeleteContext#isLogout

  • RoleDeleteContext#logout

  • RoleUpsertContext#isLogout

  • RoleUpsertContext#logout

  • interface DataClassificationService

  • interface LdapConfigurationCryptographyService

  • interface DataRelationsService

  • class DataClassifiersServiceImpl

  • class LdapConfigurationCryptographyServiceImpl

  • class CryptUtils

  • class DataRelationsServiceImpl

  • ExportRecordsExecutionRequestRO#includeRelations

  • UserReplacementRestService#get(Long, Long)

  • UserReplacementRestService#get(GetUserReplacementRequestRO)

  • UserUpsertContext#Source

  • AbstractChangeSetProcessor#applyIndexUpdates(List<IndexRequestContext>, boolean)

  • AbstractChangeSetProcessor#applyIndexUpdates(IndexRequestContext)

  • GraphEdgeConverter#to(String, Collection<Edge>)

  • GraphEdgeConverter#to(String, Edge)

  • GraphVertexConverter#to(String, Collection<Vertex>)

  • GraphVertexConverter#to(String, Vertex)

  • MetaConfigurationConstants#SOURCE_SYSTEM_NAME

  • RegisterEntityRO#relations

  • SearchResultExtendedValueRO#SearchResultExtendedValueRO(Object, String, String)

  • SearchResultExtendedValueDTO#SearchResultExtendedValueDTO(Object, String, String)

  • SubscriptionsRestService#getSubscriptions(Long, Long)

  • SubscriptionsRestService#getSubscriptions(GetSubscriptionsRequestRO)

  • SubscriptionsRestService#create(UpsertSubscriptionRequestRO)

  • SubscriptionsRestService#update(Long, UpsertSubscriptionRequestRO)

  • WorkflowProcessInstanceRestService#delete(String)

  • WorkflowProcessDeleteContext#skipCustomListeners

  • UsersGroupServiceImpl#update(UpsertUsersGroupRequest)

  • LdapItemConverterServiceImplTest#complexDisplayNameWMTest

  • ArrayAttributeSchema#packLargeValue

  • ArrayAttributeSchema#unpackLargeValue

  • ArrayAttributeSchema#READ_OLD_LOB_CONTENT

  • DataStatusService#createType

  • DataStatusTransitionHandler#handle

Методы помечены как устаревшее (deprecated) в версиях MDM старше 6.13

Среди данных методов есть endpoint-ы:

  • GET /v1/commercial-core/user-replacement/load

  • POST /v1/commercial-core/user-replacement/load

  • POST /v1/subscriptions

  • PUT /v1/subscriptions/{id}

  • GET /v1/subscriptions/load

  • POST /v1/subscriptions/load

В DataModelRollbackService#rollbackModel был добавлен функционал удаления сущностей при откате модели данных к той ревизии, где этих сущностей нет.

Добавление ресурса безопасности скачивания логов

FE:

  • Модальное окно SystemTools переименовано в DownloadLogsModal.

  • Удалены вкладки в модальном окне.

mdm/data/src/type/Resources.ts

  • Добавлен ресурс безопасности LOGS = 'SYSTEM:org.unidata.mdm.core.security.logs'

Изменение формулировки ненайденного отображаемого имени ссылочного атрибута

При просмотре записи с атрибутом ссылкой на логически удаленную запись справочника, в качестве значения была надпись "Отображаемые значения не найдены", так как при поиске значений, не просматривались удаленные или неактивные записи.

Был добавлен постфильтр для AbstractRecordDisplayNameResolver, который осуществляет поиск удаленных и неактивных записей, если первоначальный поиск не дал результатов. Если с постфильтром, запись была найдена, то в качестве значения отобразится "Запись удалена логически".

Для оптимизации и удобства запросов из AbstractRecordDisplayNameResolver в FieldsCacheService был добавлен метод fetchWithRequests(Collection<FieldsQueryContext> input). В нем результаты загрузки значений привязываются в мапе к контекстам запроса, что позволяет определить какой запрос по контексту дал результат, а какой нет.

Запрет восстановления пароля для пользователей с внешней авторизацией

Была добавлена проверка при запросе POST api/v2/core/security/user/forgot-password, которая запрещает восстановление пароля внешним пользователям (user.isExternal()).

При попытке восстановить пароль такому пользователю будет выдана ошибка EX_SECURITY_PASSWORD_RESET_EXTERNAL_USER "Функция восстановления пароля недоступна для пользователей с внешней авторизацией. Обратитесь к администратору домена".

Выгрузка журнала аудита в S3

  • В операцию exportAuditJob была добавлена группа параметров для выгрузки во внешние хранилища.

  • Параметр "Куда сохранить лог" вынесен в параметр "Сохранить в системное хранилище".

Редактирование композитных функций

org.unidata.mdm.dq.core:

  • В CleanseFunctionsValidationComponent добавлены новые валидации композитных функции.

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

  • Добавлен класс CompositeCleanseFunctionPortTypeResolver, который определяет типы портов по указанному переходу композитной функции.

Поддержка параметра order для UE SearchPageOperationMenuItem

Добавлена возможность сортировки элементов для выпадающего списка по клику кнопки "Действия".

При добавлении модуля SearchPageOperationMenuItem в "meta" можно указать { order: число} для сортировки элементов в необходимой последовательности.

Пример:

ueModuleManager.addModules('SearchPageOperationMenuItem', {
    resolver: checkDuplicatesRights,
    active: true,
    system: false,
    moduleId: 'search_page_manual_clusters_menu_item',
    component: SearchPageManualClusterMenuItem,
    meta: {
        getTitle: SearchPageManualClusterMenuItem.getTitle,
        isActive: SearchPageManualClusterMenuItem.isActive,
        order: 20
    }
});

Операция блокировки неактивных пользователей

  • Добавлена операция inactivateUsersJob и функционал блокировки пользователей системой.

  • В таблицу БД org_unidata_mdm_core.s_user были добавлены поля last_login, blocked_by_system.

  • В @universe-ee/security добавлен флаг blockedBySystem для заблокированных пользователей.

  • Во все sql запросы на получение полной информации о пользователях были добавлены новые поля, в связи с чем в класс UserRowMapper была добавлена обработка этих полей.

  • Классы-сущности пользователей и конвертеры для них также были обогащены новыми полями (User, UserDetails, UserPO). Класс UserRO был обогащен полем blocked_by_system для использования на FE.

  • Были добавлены шаблоны velocity для сообщений на email с отчетом о работе операции email_inactivate_users_report.vm.

  • В core.xml были добавлены маршруты для отправки сообщения с отчетом о работе операции.

Импорт/Экспорт ролей

Изменены проверки прав импорта/экспорта ролей. Ранее для импорта и для экспорта требовались полные права на импорт/экспорт.

Теперь для импорта - необходимо полное право на импорт/экспорт ролей, а для экспорта - только право на чтение. При отсутствии нужных прав отобразится соответствующая ошибка.

Изменения в SDK разработчика

Frontend SDK

  • Добавлена возможность в комментариях к публичным типам внутри inline-тегов @include и @includeCode прокидывать пути к подключаемым файлам с помощью переменных для подключения файлов с примерами использования публичных сущностей. Задания файловым переменным задаются в файле ud-cli.json в корне проекта. В ud-cli.json также добавлены переменные, ссылающиеся на .md файлы примеров использования точек расширения.

  • Реорганизована файловая структура репозитория frontend-example-kit.

  • В комментарии к публичным точкам расширения добавлены ссылки на файловые переменные.

  • В модуль @universe-platform/sdk добавлен плагин для замены путей.

Backend SDK - Пользовательские функции обработки данных (Cleanse Functions)

В SDK вынесен ряд классов необходимых для работы с Cleanse Function. Для корректной работы всех классов необходимо подключить зависимости из maven-sdk:

dependencies {
    implementation "org.unidata.mdm:org.unidata.mdm.dq.core-sdk:${mdmVersion}"
}

Данная зависимость автоматически подтянет за собой недостающие зависимости.

Также в SDK создан класс AbstractCustomCleanseFunction - для создания пользовательской Cleanse Function необходимо создать подкласс данного класса. Описание конфигурации пользовательской функции см. в SDK разработчика.

Добавление функции в систему:

  1. После подключения зависимостей SDK к модулю и настройки конфигурации, в котором будет разрабатываться пользовательская функция, необходимо собрать jar данного модуля с помощью gradle task.

  2. Собранный jar необходимо добавить в систему как новую библиотеку.

  3. Если функция была корректно реализована и jar правильно собрался, то библиотека будет иметь тип Функция.

  4. Перейдите в раздел "Качество данных" и добавьте новую кастомную функцию.

  5. Опубликуйте черновик и проверьте доступность функции.

Обновления:

  • Для модуля org.unidata.mdm.dq.core добавлен SDK.

  • В SDK вынесены классы MeasuredValue, SimpleAttribute, AbstractLargeValue, BinaryLargeValue, AttributeIterator, CharacterLargeValue, LargeValue, ValueType, ArrayAttribute, ArrayDataType, CodeAttribute, CodeDataType, TimeArrayValue, DateArrayAttributeImpl, EnumSimpleAttributeImpl, StringCodeAttributeImpl, AbstractArrayValue, AbstractCodeAttribute, ClobArrayAttributeImpl, TimestampArrayAttributeImpl, StringArrayValue, NumberArrayValue, DictionaryArrayValue, TimestampArrayValue, NumberSimpleAttributeImpl, BlobArrayAttributeImpl, DateArrayValue, TimeArrayAttributeImpl, AbstractSimpleAttribute, IntegerArrayValue, BlobSimpleAttributeImpl, LinkSimpleAttributeImpl, DictionarySimpleAttributeImpl, BinaryLargeValueImpl, CharacterLargeValueImpl, AbstractArrayAttribute, ClobSimpleAttributeImpl, BooleanSimpleAttributeImpl, StringSimpleAttributeImpl, StringArrayAttributeImpl, ComplexAttributeImpl, ComplexAttributeIterator, AttributeIteratorImpl, MeasuredSimpleAttributeImpl, TimeSimpleAttributeImpl, BlobArrayValue, NumberArrayAttributeImpl, IntegerSimpleAttributeImpl, TimestampSimpleAttributeImpl, AbstractAttribute, ClobArrayValue, IntegerArrayAttributeImpl, DateSimpleAttributeImpl, DictionaryArrayAttributeImpl, ComplexAttribute, IntegerCodeAttributeImpl, DataRecord, ArrayValue, SingleValueAttribute, DisplayValue, OrdinalRecord, HolderAttributeRecord, CodeLinkValue, Attribute, AttributeType, CustomPropertyElement, LargeObjectAcceptance, UPathCollectorElement, UPathElement, UPathElementType, UPathResult, UPathApplicationMode, UPathFilterElement, UPathIncompletePath, CleanseFunctionPortFilteringMode, CleanseFunctionInputParam, CleanseFunctionPortValueType, CleanseFunction, CleanseFunctionParam, ParamType, CleanseFunctionConfiguration, CleanseFunctionExecutionScope, CleanseFunctionOutputParam, CleanseFunctionDefaults, CleanseFunctionPortInputType, SeverityIndicator, DataQualitySpot, AbstractNamedSpot, DataQualityError, CleanseConstants, CleanseFunctionContext, CleanseFunctionResult

  • Из классов ArrayAttribute, CodeAttribute и SimpleAttribute в AttributeUtils вынесены методы конвертации AttributeValueType, чтобы не выносить в SDK AttributeValueType и его зависимости

  • Из классов ArrayAttribute, CodeAttribute и SimpleAttribute в AttributeUtils вынесены методы конвертации FieldType, чтобы не создавать SDK для модуля org.unidata.mdm.search

  • В SDK создан класс AbstractCustomCleanseFunction, используемый для создания пользовательских Cleanse Function.

Версионирование бизнес-процессов

Frontend:

  • @universe-ee/workflow:

    • Для отображения списка бизнес-процессов (БП) теперь используется компонент Table вместо Tree, поскольку Tree использует неподходящую в данном случае логику отображения rowActions

    • VersionsExtraItem — добавлен компонент дропдауна выбора версий БП

    • VersionsListDrawer — добавлен комонент список всех версий БП

    • VersionsCompareModal — добавлен компонент сравннеия версий

    • Изменены параметры операций получения модели БП. Теперь вместо различных параметров с draftId, версией и ревизией используется один параметр-объект

    • В AbstractProcessDifferenceStore вынесена общая логика по сравнению моделей БП. Созданы два наследника для сравнения ревизий и версий

    • В таблицу поиска задач/процессов добавлена колонка с версией БП

    • В карточку задачи/процесса добавлен вывод версии БП

    • В карточке задачи/процесса выводится схема и индексируемые переменные, относящиеся к конкретной версии БП

  • @universe-platform/meta:

    • Верхняя часть модального окна сравниния ревизий (с двумя селекторами и кнопкой "Сравнить") вынесена в отдельный компонент RevisionComparisonSelector

Backend:

  • Изменен deploy в Camunda. BpmnModelComponent#deployProcessDefinitions(String storageId, List<String> processNames) деплоит новую BPMN, только если она отличается от старой.

    • BpmnModelComponent#deployProcessDefinitions(String storageId, List<String> processNames, boolean force) при force == true деплоит все переданные BPMN.

    • В WorkflowModelComponent#deployProcessDefinitions в метод BpmnModelComponent#deployProcessDefinitions передаются только измененные BPMN.

    • Таким образом в движке camunda будут храниться только отличающиеся диаграммы, а в bpmn_models будут храниться все ревизии

  • Добавлен флаг force, который будет деплоить все переданные процессы. В метод передаются те процессы, версия которых отличается от версии всей модели (эти процессы получили изменение)

  • В act_ge_bytearray добавлен столбец process_key_, хранящий process_id из xml столбца bytes_

  • Добавлен триггер, который при вставке записи в таблицу act_ge_bytearray, заполняет process_key_ из xml файла столбца bytes_

  • В WorkflowModelInstanceImpl добавлена processVersions, содержащая все версии и ревизии модели Workflow. Она хранит только метаинформацию о версиях, а не содержимое версий

  • В xml файл ревизии модели добавлен список существующих версий бизнес процессов. При удалении БП из XML удаляются информация о его версиях

  • В endpoint-ы WorkflowBpmnRestService#get и WorkflowProcessDefinitionRestService#getProcessDefinition добавлены параметры version. Данный параметр имеет приоритет над lud, но draftId и revision имеют приоритет над данным параметром

  • В OpenSearch добавлено поле $definition_version для task, сохраняющее ревизию BPMN модели, для которой выполняется task

  • Добавлен endpoint получения всех существующих версий БП WorkflowProcessDefinitionRestService#getProcessDefinitionVersions