Журнал технических изменений¶
Версия 6.12
Валидация спецсимволов в External Id¶
Изменен парсинг external key. Разрешено использование пробелов в External Id.
Уведомление о сроке окончания лицензии¶
@universe/license - в
LicenseManager
добавлен методgetIsSoonExpire
, проверяющий, скоро ли окончится действие лицензии.@universe-ee/base-app -
loginHandler
после успешной авторизации запускает проверку срока действия лицензии и отображает уведомление о скором окончании.@universe-platform/app - создание
loginHandler
вынесено в отдельный методgetLoginHandler
, чтобы можно было переопределять его из дочернего класса.
Связи типа "Включение" удалены из uPath в "Качестве данных"¶
К uPath input в DQ был добавлен новый фильтр UPathMdmFilters.disallowRelationType(disallowRelType?:string)
, который удаляет из typeName возможность выбрать связь "Включение".
uPath в "Правилах сопоставления" остался без изменений.
Точка расширения InnerCompareStore¶
В релизе 6.12 удалена точка расширения InnerCompareStore.
Виджет "Черновики" на главной странице¶
FE:
Добавлен новый запрос POST ReadMultiDraftListOp.
В запрос ReadDraftListOp добавлено два ключа - owner и state.
BE:
Расширено API: новый endpoint v2/draft/multidrafts.
Режим вставки комплексного атрибута (PATCH)¶
org.unidata.mdm.rest.v2.data:
Добавлен флаг patch в UpsertRequestRO, отвечающий за частичное обновление атрибутов записи.
org.unidata.mdm.data:
Реализован функционал для частичного обновления комплексных атрибутов.
UI UX: Экрана настройки БП¶
@universe-platform/uikit
Поправлено поведение компонента Resizer, если он расположен с левой стороны от масштабируемого контейнера.
@universe-ee/workflow
Появилась функция масштабирования и сворачивания панели редактирования параметров бизнес-процесса.
Были поправлены некоторые визуальные дефекты на экране бизнес-процесса.
Запуск Tomcat в контейнере BE MDM от пользователя tomcat¶
Реализован запуск tomcat в контейнере от пользователя tomcat. Права "root" в контейнере BE MDM больше не требуются.
Импорт/экспорт потоков выполнения¶
Для поддержания возможности импорта/экспорта потоков выполнения в разделе "Импорт/Экспорт" был расширен API новыми эндпоинтами:
Эндпоинт для импорта потоков выполнения из файла: v2/core/system/pipeline/import. Формат файла JSON. Файл передается в теле запроса, также передается флаг
recreate
, который помечает, нужно ли пересоздание потоков.Эндпоинт для экспорта потоков выполнения: v2/core/system/pipeline/export. Формат файла JSON.
Удаление связей в meta-data-driven¶
В тело запроса на обновление записи было добавлено поле relationsDeletes
. В тело ответа для связи было добавлено поле etalonId
.
com.universe.mdm.metadriven.core:
В RecordInputRO добавлено поле
relationsDeletes
;В RelationOutputRO добавлено поле
etalonId
.
Эксплуатация приложения без прав superuser для БД¶
Права суперпользователя больше не требуются для установки приложения.
Удаленные API¶
Удалено Deprecated API:
TagsRestService#deprecatedDelete(DeleteTagsRequestRO):
DELETE /v2/core/tags/delete
DELETE /v2/search/tags/delete
DELETE /v1/marks/tags/delete
UserNotificationsRestService#getUserNotifications:
/v2/core/user/notifications/{p:/?}{date: (([0-9T-:.]{23})?)}
RoleRestService#getAllSecurityLabels (до этого был скопирован в SecurityLabelRestService):
/v2/core/security/role/get-all-security-labels
Удалены следующие методы и поля:
XLSXProcessor#RELATION_TITLE_LABEL
XLSXProcessor#ENTITY_TITLE_LABEL
XLSXProcessor#LOOKUP_ENTITY_TITLE_LABEL
XLSXProcessor#COMPLEX_TO_NESTED_DISPLAY_NAMES_DELIMITER
XLSXProcessor#buildSheetName
XLSXProcessor#identifySheet
XlsxImportState#withNested
ClassificationImportXlsxRenderingComponent#identifySheet
ClassificationImportXlsxRenderingComponent#isEmptyRow
ClassificationImportXlsxRenderingComponent#convertToString
ClassificationImportXlsxRenderingComponent#getExcelCoordinates
ClassificationImportXlsxRenderingComponent#normalizeTo
Покрытие тестами класса SearchFormFieldDeserializer¶
Добавление searchType по умолчанию для запросов без searchType. Для запроса имеющего узел value/values устанавливается searchType = EXACT, для запроса имеющего узел range устанавливается searchType = RANGE.
Запрет передачи значения null в качестве имени искомого атрибута name: null.
Замена npe при невалидном значении типа искомого атрибута type: someWrongType на читаемый JsonMappingException с сообщением "Types other then simple types [ someWrongType ] aren't supported.".
Замена IllegalArgumentException при передаче невалидного типа поиска searchType: someWrongType на читаемый JsonMappingException с сообщением "Unsupported search type [ someWrongType ]".
Обработка исключения отсутствия всех значений value, values и range. Если в запросе нет ни value, ни values, ни range, то будет брошен JsonMappingException с сообщением "Requires single 'value' or 'value_s_' or 'range' node.".
Запрет одновременного использования флагов like, startWith, fuzzy, morphological. Можно установить в true только один из данных флагов, т.к. каждый из флагов переписывает searchType.
Установка searchType == EXIST в случае когда запрос делается по values, без searchType и values is Null.
Понижение приоритета флага like. Если все значения запроса пусты, searchType устанавливается в EXIST, а значение like игнорируется.
При searchType == RANGE, если значение range отсутствует, бросается JsonMappingException с сообщением "Range search type must contain a range node".
Если range: null, бросается JsonMappingException с сообщением "Range node must be an array". range всегда должен быть массивом.
Если searchType == START_WITH или searchType == MORPHOLOGICAL или searchType == LIKE, но тип искомого значения не равен STRING, CLOB или BLOB, бросается JsonMappingException с сообщением *"START_WITH/MORPHOLOGICAL/LIKE search type cannot be applied to a value of type typename".
Прочие изменения:
AttributeUtils#toDate, AttributeUtils#toTimestamp, AttributeUtils#toTime, AttributeUtils#toInstant исправлено внутреннее сообщение сервера, в соответствии с сообщением из файлов properties.
Исправление срабатываний анализатора Svacer¶
Возвращаемый тип DataTableFormatter#zip изменен с InputStream на File, т.к. InputStream может быть не закрыт в дальнейшем.
Новая проверка состава Бизнес ключа в процессах¶
Убрана проверка, которая не позволяла хранить в ключе ничего кроме namespace и draftId.
Добавлена проверка на корректность, в случае, если у БП есть linkedSubjectId и linkedTypeName тогда ключ обязательно должен начинаться c namespace и draftId, далее может быть что угодно, главное присутствие namespace и draftId.
Пример: register:test:draftId:148:кастомноеполе1:кастомноеполе2
Переделана логика нахождения процессов по бизнес ключу: теперь процесс находится по draftId внутри бизнес ключа, так как в бизнес ключе теперь могут быть пользовательские поля.
Внутренние изменения логики сравнения записей¶
Реализован новый стор для сравнения записей - RecordsCompareStore.
В нем посредством user-exit-a UEInnerCompareStore подключаются внутренние сторы сравнения. Каждый внутренний стор реализует логику сравнения для своего пространства имен: генерирует колонки, строит diff-ы, определяет внешний вид колонок.
Колонки в сравнении делятся на два типа: мета-колонки и дата-колонки. Мета-колонки отображаются в панели настроек, а дата-колонки в самой таблице. На одну мета-колонку может приходиться несколько дата-колонок либо дата-колонок может не быть вовсе (пример: колонки классификатора).
Поскольку каждое окно сравнения записей может иметь уникальные методы загрузки данных и уникальное отображение ячеек таблиц, был реализован глобальный интерфейс UniverseCompare, который хранит следующие типы:
ICompareTypeArgsMap - Объект, объявляющий тип сравнения (ключ объекта) и параметры, использующиеся для загрузки данных этого типа сравнения;
INamespaceLoadResultMap - Объект, объявляющий тип возвращаемых после загрузки значений для каждого пространства имён.
CompareType - тип, содержащий все виды сравнения.
Тип сравнения - один из параметров конструктора RecordsCompareStore. Каждый тип сравнения имеет свои аргументы загрузки данных. В параметры конструктора стора сравнения попадают не уже загруженные записи, а массив параметров загрузки сравниваемых записей.
Типы из UniverseCompare используются в реализации менеджера методов сравнения CompareRecordMethodsManager. Данный менеджер регистрирует для каждого пространства имён каждого типа сравнения:
загрузочные функции;
рендеры ячеек;
функцию, определяющую может ли в таблице сравнения быть выбран какой-либо dataPath.
В результате, при инициации стор сравнения RecordsCompareStore проходит по всем зарезолвленным UE, создает вложенные сторы сравнения, и загружает данные посредством загрузочных методов, зарегистрированных в CompareRecordMethodsManager.
Пункт главного меню "Процессы"¶
Были разделены пути для "Процессов" и "Задач".
module-ee/workflow/src/index.ts
Для процессов - 'ProcessesPage';
Для задач - 'TasksPage';
routeFunc и routeAccessor, так же разделены.
Отображение системной информации при сравнении записей¶
RegisterCompareStore.ts, LookupCompareStore.ts - данные получаются при помощи getValueByPath()
INamespaceLoadResultMap - изменен тип register: IRecordEntity на:
register: {
dataRecord: IRecordEntity;
recordKeys?: RecordKeys
};
InnerCompareCtorData - добавлен флаг showSystemInfo.
SystemRow.ts - константы для колонки системной информации.
Отображение "Etalon ID" связанной записи в сравнении связей¶
RelationCompareStore.ts
Был добавлен метод получения EtalonIdTo - public getEtalonIdTo (relation: AbstractRelation): string | undefined.
InnerCompareStore.ts
Добавлен новый параметр в ColumnView - getColumnHeader?: (metaColumn:ISearchColumn,columnName:string)=>ReactNode;
AbstractRelationInnerCompareStore.ts
Добавлен метод getColumnHeader
Добавлен новый компонент RelationCompareColumnHeader для отображения подсказки.
Уведомление состояния записи¶
Изменился формат сообщения meta-driven, уведомления о вставке и удалении.
Сортировка списка значений перечисления¶
@universe-platform/model
В класс ModelCollection был добавлен метод sort для сортировки элементов коллекции.
@universe-platform/uikit
В компоненте HeaderCell иконки фильтрации и сортировки отображаются сразу после названия колонки, а не прижимаются к правой границе.
@universe-platform/meta
В компоненте EnumerationEditorForm добавлена возможность сортировки значений выбранного перечисления по id и отображаемому имени.
Доработка отображения cron-выражений на экране операций¶
@universe-platform/cron
Добавлен компонент ScheduleFieldInput, который отрисовывает уже присутствующий в этом пакете ScheduleInput вместе с названием поля.
@universe-platform/model-form
У компонентов ModelField и ModelForm добавлена возможность менять вид отображаемых полей при помощи свойства fieldRender.
Операция мониторинга расхождений в данных¶
Добавлена новая операция - "Операция мониторинга расхождения в данных".
Добавлен новый модуль com.universe.mdm.job.data.difference
.
Критерий поиска задач/процессов "Доступные мне"¶
В момент mount компонента WorkflowCard добавляется SearchTerm AvailableForMeST.
Также добавлена проверка на наличие SearchTerm, т.к. критерий "Доступные мне" не нужно добавлять, если поделить с кем-то URL.
Измененная группировка поисковых критериев¶
DropDownTreeStore.ts
Добавлен новый ключ needDivider?: boolean
в тип DropDownTreeNode.
Добавлен новый компонент для рендера кнопки "Избранные" - FavoriteRecordsButton.tsx.
mdm/data/src/page/search/store/search_panel_store/systemTerms.ts - изменен порядок вывода поисковых критериев.
Стилизация системы¶
Добавлен опциональный флаг ENABLE_EXPERIMENTAL_THEME_PAGE
в customer.json (по умолчанию false).
Добавлен опциональный конфигурационный файл theme.json (по умолчанию отсутствует, используется системная тема).
Выбор классификации записи¶
@universe-ee/data-classifier:
Изменился вид всплывающиго окна для выбора узлов классификатора в закладке "Классификация" в карточке записи.
@universe-platform/confirm:
В компонент Confirm было добавлено свойство isFlexBody по аналогии с компонентом Modal.
@universe-platform/tree:
В VirtualTreeStore добавлена возможность получения детей корневого элемента дерева с помощью getNodeChildren.
В компонент VirtualTree добавлено свойство isDisabled, запрещающее выбирать какие-либо ноды.
Виджеты карточки задачи¶
Модуль @universe-ee/workflow:
Добавлена точка расширения UETaskCardDescriptionWidget для отображения в карточке задачи различных виджетов для секции "Описание". Можно задать виджету расположение - колонку (левая или правая) и порядок в колонке. Левая и правая колонка будут отсортированы отдельно.
Добавлен компонент WorkflowListsWidget, показывающий результаты заданного количества поисковых выдач по workflow в виде списков ссылок, внешний вид которых адаптирован под показ ссылок на задачи и процессы, которые расположены во вкладках виджета.
Также из карточки задачи удален компонент EmbeddedTasksList. Чтобы вернуть старый виджет на прежнее место необходимо:
Отключить точку расширения subjectWorkflowEntitiesList.
Реализовать точку UETaskCardDescriptionWidget одним из трех вариантов:
Использовав WorkflowListsWidget (Рекомендуется. Специализировано для workflow, можно настроить).
Использовав SearchLinksList/SearchLinksWidget (То же самое, но абстрактное, не специализировано под workflow. List отображает один список, Widget - набор списков во вкладках).
Вернув старый компонент EmbeddedTasksList (Не рекомендуется).
Указать созданной точке расширения meta.column = 1 и meta.order = 0 - таким образом она будет размещена там же, где ранее располагался EmbeddedTasksList.
Отображение связей записи в табличном виде¶
Добавлен новый endpoint POST v2/data/relations/filtered-relations/ и метод
getRelationsByRecordEtalonIdAndBoundary(GetRelationsRequestRO)
, получающий отфильтрованные связи на указанной странице с заданными сортировками. Связи сначала ищутся в openSearch, а затем для найденных relation загружается их актуальное состояние из БД.Ответ на запрос
GetRelationsResultRO
добавлено полеtotalCount
, необходимое для пагинации.В
getRelationsByRecordEtalonIdAndBoundary
запроса v2/data/relations/relation-bulk/ добавлены параметры page и count. page - страница в openSearch, count - количество получаемых на странице записей. Теперь обращение к POST v2/data/relations/filtered-relations/ происходит без указания фильтров.getRelationsByRecordEtalonIdAndBoundary
запроса v2/data/relations/relation-bulk/ объявлен Deprecated.В
CommonRelationsComponent#loadTimelinesExt
внесены изменения, позволяющие при наличии указания конкретных etalonKeys связей подгружать их также из черновиков.Класс
GetRelationsBulkRequest
переименован вGetRelationsData
и сделан внутренним статическим классом классаDataRelationsRestService
.Создан REST обогащения черновика
CheckStateRestService#applyEnrichment
. В данном методе вызываетсяEnrichmentService#applyEnrichment
. Внутри него через ренедеринг создается множество контекстов вставки текущего состояния указанной записи. Каждый контекст вставки записи соответствует периоду актуальности записи. В первый контекст вставки записи добавляются фрагменты вставки связей и классификаторов, затем осуществляется batchUpsert.В пайплайн вставки записи добавлен шаг DQ: если фаза вставки записи "DRAFT", то осуществляется DQ, а затем вставляется обогащенное состояние записи.
Поднят флаг
trackEnrichments
при включенном обогащении.Поля
DataQualitySpot
, отвечающие за идентификацию атрибута на FE, вынесены в абстрактный классAbstractNamedSpot
.DataQualityEnrichment
наследуется отAbstractNamedSpot
для подсветки обогащенных полей на FE.Переработан
CheckStateBlockConverter
для конвертации enrichments атрибутов.ClassificationUpsertTimelineExecutor
, если существует не пустойnextTimeline
, используется его в качествеmodificationBox
.
Классификация записей промежуточными узлами версии классификатора¶
Добавлена возможность устанавливать флаг для назначения классификатора на реестр/справочник, который запрещает создавать классификации записей промежуточными узлами версии классификатора.
Backend:
Ранее параметр leafOnly был в параметрах назначения классификатора, в том числе в запросе /v1/classifiers/model/classifier. При этом GET /v1/classifiers/model/classifier всегда возвращал false в поле leafOnly. В текущем релизе это исправлено.
Теперь у назначений полностью поддерживается параметр leafOnly, который показывает, можно ли создавать классификации по неконечным узлам. При попытке создать классификацию по неконечному узлу при условии, что leafOnly = true для назначения на эту сущность, возникает ошибка валидации.
Frontend:
platfom/uikit:
EditableCell.tsx - добавлена поддержка Checkbox;
CheckboxInput.tsx - соответсвенно, checkbox;
cell.tsx - изменены условия для рендера value и editableCell. Поскольку у чекбокса нет value, которое можно было отрендерить, нужно рендерить сам компонент. Поэтому добавлена проверка на
editComponentType === EditComponentType.checkbox
.
ClassifierClassificationDataStore.ts:
Добавлен новый метод isLeafOnly;
Новая переменная
classificationNodeError: ObservableSet<ClassifierNode>
, которая хранит добавленные ошибочные узлы классификации на карточку записи;setClassificationNodeError
- метод для расчетаclassificationNodeError
.
Движок JSON-правил¶
@universe-platform/parameters: в компонент ParameterItem добавлена поддержка скрытия параметра через дескриптор;
@universe/json-rules:
Добавлены классы JsonRuleFormStore, JsonRuleFormEventHandler, JsonRuleFormValueParser, позволяющие использовать функциональность JSON-правил;
Добавлена обертка над библиотечным правилом UdRule, позволяющая указывать событие, которое будет эмититься, если правило завершится с ошибкой;
@unidata-mdm/matching: в MatchingAlgorithmParameterList логика взаимодействия инпутов формы переписана на JSON-правила;
@universe-ee/data: в ImportWizardButtonStore и ExportExcelRecordsStore логика взаимодействия инпутов формы переписана на JSON-правила.
Обновление/удаление назначений правил качества¶
В UpsertQualityModelContext были добавлены новые поля для обновления/удаления назначений по связке namespace + typeName:
typeAssignmentsUpdates - обновление назначений по namespace + typeName,
typeAssignmentsMerges - объединение назначений по namespace + typeName,
typeAssignmentsDeletes - удаление назначений по namespace + typeName.
Существующий функционал объединения назначений правил качества (DataQualityModelComponent#merge) был дополнен с учетом новых полей.
Настройка контейнеров хранилищ¶
Добавлены новые таблицы;
Добавлена новая модель;
Добавлены два новых модуля
com.universe.mdm.los.s3
иcom.universe.mdm.job.los.migrate
;Добавлена джоба миграции больших объектов;
В API больших объектов добавлен новый параметр - имя контейнера конфигурации;
В API добавлен новый блок обслуживания модели хранения больших объектов.