Методы для чтения данных из 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 из переходного ключа, а также получения информации о группе.
В специальной переменной support предусмотрены следующие функции:
-
@[#itemGuid] – получить guid текущей обогащаемой позиции. Данная сигнатура используется без 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 не существует, то будет возвращена ошибка.
Пример получения идентификатора в системе 1С_ERP для обогащаемой позиции:
String itemUid = support.getSourceId(@[#itemUid], "1C_ERP")
Чтение значений атрибутов позиции
Основным способом чтения значений атрибутов текущей позиции, является чтение через конструкцию @[имя атрибута]. Для чтения значения вложенных в агрегации атрибутов, необходимо последовательно перечислить имена атрибутов, например:
-
@[имя атрибута связи][имя вложенного атрибута];
-
@[имя атрибута связи][имя вложенного атрибута связи][имя вложенного атрибута];
-
@[#composer][ имя вложенного атрибута];
-
@[#composer][имя вложенного атрибута связи][ имя вложенного атрибута].
Перечисленные конструкции вернут одно значение атрибута, если все перечисленные в конструкции атрибуты хранят единичное значение. Если хотя бы один из перечисленных в конструкции атрибутов хранит массив значений, то данная конструкция вернет List значений.
Кроме получения списка значений (List) для вложенного атрибута, есть возможность получить полный путь до этого значения через метод: getMapValues(), который вернут Map<String, Object>, где String будет содержать GUID агрегированной позиции, а Object будет содержать либо значение заданного атрибута, либо еще один Map<String, Object>, если путь к вложенному атрибуту состоит из более чем одного атрибута связи.
Примеры возвращаемых значений:
-
@[имя множественного атрибута связи][имя вложенного строкового атрибута].getMapValues() – данная конструкция вернет Map<String, String>
-
@[имя множественного атрибута связи] [имя единичного атрибута связи] [имя вложенного строкового атрибута].getMapValues() – данная конструкция вернет Map<String, Map<String, String>>
-
@[имя множественного атрибута связи] [имя единичного атрибута связи] [имя вложенного множественного строкового атрибута].getMapValues() – данная конструкция вернет Map<String, Map<String, List<String>>>
Для каждого из типов данных атрибутов, будет возвращен свой тип данных:
-
-
-
-
-
-
цвет: Long. – число в формате Blue, Green, Red, Alpha, где Blue – старший байт, а Alpha – младший байт. Пример красного цвета в шестнадцатеричном строковом представлении: “241CEDFF”, где: Blue=24, Green=1C, Red=ED, Alpha=FF. Или:
-
Преобразование цвета из шестнадцатеричного строкового представления в число: Long.parseLong("241CEDFF",16);
-
Преобразование числа в строковое шестнадцатеричное представление: Long.toString(605875711,16);
-
файл: String - имя файла;
-
атрибут связи: String - с guid позиции.
Если основной способ чтения значений атрибутов текущей позиции по каким-либо причинам не позволяет организовать чтение требуемых данных или требуется прочитать значения атрибутов найденных позиций через поиск, то для чтения значений атрибутов позиций, в системе предусмотрены следующие методы:
-
List<PropertyValueDto> getItemPropertyValues(String itemUid, List<long> PropertyIds) – получить список значений атрибутов по GUID позиции (itemUid). Если атрибут содержит множественные значения, то для каждого значения будет возвращен свой PropertyValueDto, с одинаковым PropertyValueDto.propertyId.
Свойства PropertyValueDto:
-
String itemUid – идентификатор позиции
-
long propertyId – числовой идентификатор атрибута
-
String stringValue – содержит строковое значение атрибута, если тип данных: String или Text. Содержит GUID позиции, если тип данных Aggregation или Composition
-
ExchangeComplexDouble doubleValue – содержит число с плавающей запятой, если тип данных: Double.
-
long integerValue – содержит целое число, если тип данных Int
-
ExchangeFile fileValue – содержит наименование файла и хэш содержимого. Если тип данных с, то наименование файла будет пустым;
Свойства ExchangeFile:
-
name – наименование файла, для изображения не указывается;
-
bodyHash – хэш тела файла;
-
Boolean booleanValue – содержит булевое значение, если тип данных Bool
-
Date dateValue – содержит дату, если тип данных DateTime
-
String nameValue – содержит наименование контекста для контекстных значений атрибута
Свойства ExchangeComplexDouble:
-
String getMeasurementUnit – получить GUID единицы измерения Semantic MDM, в которой она должна отображаться в Semantic MDM
-
ValueDoubleTransfer getValue – получить объект класса ValueDoubleTransfer со следующими методами:
-
double value – содержит основное значение атрибута в базовой единице измерения, если из внешней системы передается простое число с плав. запятой или число с отклонениями. Отклонения для числа с плав. запятой будут храниться в min и max соответственно. Для диапазона, должно содержать центральное значение диапазона, к которому при прибавлении значения из min, получаем нижнюю границу отклонения, а при прибавлении значения из max, верхнее отклонение
-
double min – получить значение нижнего отклонения
-
double max – получить значение верхнего отклонения
-
encodedString – строковое кодированное значение, содержит значения value, min и max в той ЕИ, в которой задал значение пользователь. Значение в encodedString кодируется следующим образом: value=<среднее число >; min=<нижнее отклонение, всегда меньше нуля>; max=<верхнее отклонение, всегда больше нуля>; measure=<числовой идентификатор ЕИ>; precision=<количество знаков после запятой для округления>; type=<тип ЕИ: “NORMAL”, “RANGE”, “DEFLECTIONS”>. Примеры кодированной строки encodedString:
-
“value=200;min=0;max=0;measure=313;precision=5;type=NORMAL”
-
“value=0;min=300;max=400;measure=313;precision=5;type=RANGE”
-
“value=10;min=-0.1;max=0.15;measure=313;precision=5;type=DEFLECTIONS”
-
List<PropertyValueDto> getItemsPropertyValueList(List<String> itemUids, List<long> PropertyIds) – получить список значений для атрибутов указанных в PropertyIds и позиций указанных в itemUids. Если PropertyIds содержит пустой список, то будут возвращены значения всех атрибутов. Для каждого PropertyValueDto в свойстве itemUid будет указан guid позиции, к которому относится возвращенное значение атрибута. Если атрибут содержит множественные значения, то для каждого значения будет возвращен свой PropertyValueDto, с одинаковым PropertyValueDto.propertyId и одинаковым PropertyValueDto.itemUid.
Метод getItemPropertyValues возвращает список всех значений атрибутов для заданной позиции (itemUid). Для чтения значений конкретного атрибута из полученного списка, необходимо знать идентификатор и тип данных атрибута, а также множественное у него значение или нет. Для получения этой информации в скрипте, необходимо использовать метод getPropertyDeclarationsByNodeUid.
Ниже представлены примеры чтения значений атрибутов.
Пример чтения значений атрибутов: “Наименование изделия”, “Диаметр”, “Материал->Марка материала”:
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, false);
attrValue = itemValues.find {element -> element. propertyId()==@[Марка материала].toId()};
if (attrValue!=null)
{String prodMatMark = attrValue.stringValue}
}
Чтение данных по атрибутам
Чтение данных по группам