Методы для чтения данных из Semantic MDM
Выполнение поиска позиций
Возможны различные сценарии импорта, при которых необходимо выполнить поиск позиции по заданным атрибутам в справочнике Semantic MDM. Например, найти в классификаторе группу по коду или найти материал по марке и стандарту на материал и далее прописать сопоставление с найденной позицией в импортируемый объект.
Для реализации этих сценариев, в скрипт Groovy добавлены функции выполнения поиска позиции в заданной группе или в заданном классификаторе:
-
SearchParamsBuilder findInNode(String nodeUid) – выполнить поиск в заданной группе (
nodeUid) и вернуть первые 100 позиций;
-
SearchParamsBuilder findInNodes(List<String> nodeUids) – выполнить поиск в заданном списке групп (
nodeUids) и вернуть первый 100 позиций;
-
SearchParamsBuilder findInClassifier(String nodeUid) – выполнить поиск в заданной классификационной группе (
nodeUid) классификатора и вернуть первые 100 позиций. Данный метод востребован, при необходимости выполнить поиск позиции, среди позиций, классифицированных группой отдельного классификатора, например,
ОКВЭД2,
ОКПД2,
ЕКПС и т.д..
Данные функции возвращают построитель критериев поиска (SearchParamsBuilder) в котором можно с помощью функций byValue(String value, String propertyId) и byStatus(ItemStatus status) добавить параметры поиска и далее выполнить поиск с помощью функции Invoke(), которая вернет список Uuid позиций (List<String>), найденных в Semantic MDM. Каждая из функций: byValue и byStatus возвращает построитель запросов SearchParamsBuilder, дополненный критерием по значению атрибута (byValue) или статуса (byStatus) соответственно, что позволяет путем последовательного вызова этих функций сформировать требуемый поисковый запрос и выполнить его. Примеры вызова представлены ниже.
Пример поиска страны в классификаторе ОКСМ по наименованию и статусу “Нормализована” :
List<String> itemUids = support.findInNode("55805ab0-15cd-4523-9fc2-f926fcf3b376").byValue("РОССИЯ" , @[Наименование ОКСМ].toPath()).byStatus(ItemStatus.Standardized).invoke();
Пример поиска в справочнике материалов по марке материала, стандарту на материал и статусу “Нормализована”:
List<String> itemUids = support.findInNode("2003b902-7bee-49d5-9401-02fb79e1d6e9").byValue("Ст3кп", @[Марка материала].toPath()).byValue("ГОСТ 380-94", @[Стандарт на материал][Сокращенное наименование].toPath()).byStatus(ItemStatus.Standardized).invoke();
Чтение данных о позиции
В сценариях импорта, могут встречаться задачи получения текущего статуса позиции, получения идентификатора внешней системы или идентификатора Semantic MDM из переходного ключа, а также получения информации о группе. Пример сценария импорта: получить по идентификатору внешней системы идентификатор позиции Semantic MDM, проверить статус связанной позиции в Semantic MDM и если он соответствует статусу “Заблокирована”, “Удалена”, “Дубликат”, то отменить импорт и вернуть ошибку, в противном случае, выполнить импорт по штатному алгоритму.
Для решения этих задач, в скрипте Groovy, в специальной переменной support предусмотрены следующие функции:
-
ItemStatus getItemStatus(String itemUid) – получить статус позиции по GUID (
ItemUid) позиции. Функция вернет одно из следующих значений:
-
NULL - если позиция с переданным
itemUid не существует
-
ItemStatus.Abnormal – соответствует статусу “
Не нормализована”;
-
ItemStatus.Standardized – соответствует статусу “
Нормализована”;
-
ItemStatus.Blocked – соответствует статусу “
Заблокирована”;
-
ItemStatus.Removed – соответствует статусу “
Удалёна”;
-
ItemStatus.Duplicate – соответстует статусу “
Дубликат”.
-
String getMDMId(String sourceId, String systemId) – получить GUID позиции по идентификатору объекта (
sourceId) во внешней системе и идентификатору внешней системы (
systemId). Вернет
NULL если переходной ключ отсутствует.
-
String getSourceId(String itemUid, String systemId) – получить идентификатор объекта во внешней системе по GUID позиции (
itemUid) и идентификатору внешней системы (
systemId). Если переходной ключ отсутствует, то вернет
NULL.
-
String getItemNodeUid(String itemUid) – получить GUID группы, которой принадлежит позиция с указанным GUID (
itemUid). Если позиция с переданным GUID не существует, то будет возвращена ошибка.
Пример получения GUID позиции для импортируемого объекта:
String itemUid = support.getMDMId(root.getSourceId(), root.getExternalSystemId())
Чтение значений атрибутов позиции
Для чтения значений атрибутов позиции, необходимо использовать следующий метод:
Метод
getItemPropertyValues возвращает список всех значений атрибутов для заданной позиции (
itemUid). Для чтения значений конкретного атрибута из полученного списка, необходимо знать идентификатор и тип данных атрибута, а также множественное у него значение или нет. Для получения этой информации в скрипте, необходимо использовать метод
getPropertyDeclarationsByNodeUid (подпункт
“Чтение данных по атрибутам из Semantic MDM”).
Ниже представлены примеры чтения значений атрибутов.
Пример чтения значений атрибутов: “Наименование изделия”, “Диаметр”, “Материал->Марка материала”:
List<PropertyValueDto> itemValues = support.getItemPropertyValues("a1ddfe35-6fca-4f25-b874-604d082d9d3c");
//Получим значение атрибута "Наименование изделия"
PropertyValueDto attrValue = itemValues.find {element -> element. propertyId==@[Наименование изделия].toId()};
if (attrValue!=null)
{String prodName = attrValue.stringValue}
//Получим значение атрибута "Диаметр" в миллиметрах
attrValue = itemValues.find {element -> element. propertyId==@[Диаметр].toId()};
If (attrValue!=null)
//Получим диаметр в миллиметрах
{Double prodDiam = doubleValue.getValue().value/1000}
//Получим значение атрибута "Материал->Марка материала" в миллиметрах
attrValue = itemValues.find {element -> element. propertyId==@[Материал].toId()};
if (attrValue!=null)
{
prodMatUid = attrValue.stringValue;
List<PropertyValueDto> MaterialValues = support.getItemPropertyValues(prodMatUid);
attrValue = itemValues.find {element -> element. propertyId==@[Марка материала].toId()};
if (attrValue!=null)
{String prodMatMark = attrValue.stringValue}
}
Пример получения списка гуидов позиций из множественного атрибута “Логистические ЕИ”:
List<PropertyValueDto> itemValues = support.getItemPropertyValues("a1ddfe35-6fca-4f25-b874-604d082d9d3c");
List<PropertyValueDto> attrValues = itemValues.findAll {element -> element. propertyId==@[Логистические ЕИ].toId()};
List<String> itemGuids = attrValues.collect {element -> return element.stringValue };
Чтение данных по атрибутам из Semantic MDM
Чтение данных по группам из Semantic MDM