Пример решения задачи сопоставления с позицией вспомогательного справочника
Данный пример демонстрирует возможность выполнения программного сопоставления с классификационной группой по коду классификатора ОКПД2, а также сопоставления по марке материала с материалом из вспомогательного справочника материалов.
Пример настройки обменного класса для импорта номенклатуры:
Для выполнения программного сопоставления, были разработаны два скрипта Groovy, один для атрибута “Материал”, второй для атрибута “ОКПД2”.
Формула импорта для атрибута “Материал”:
String transformValue(ProcessObject root, ProcessedValue value) {
//Получим значение вложенного атрибута
ProcessedValue attrVal = value.getProcessObject().getValues().find {element -> element.getName()=="МаркаМатериала"};
//Удалим все вложенные значения в атрибут "Материал", чтобы новый объект марки не был создан
value.getProcessObject().getValues().clear();
//Если получили значение с маркой материала
if (attrVal!=null)
{ //Если значение марки не пустое
if (attrVal.getStringValue()!=null)
{
//Получим искомое значение марки материала и выполним поиск в справочнике
String SearchVal = attrVal.getStringValue();
List<String> itemUids = support.findInNode('2003b902-7bee-49d5-9401-02fb79e1d6e9')
.byValue(SearchVal, @[Марка материала].toPath())
.byStatus(ItemStatus.Standardized).invoke();
//если найдена одна единственная марка, о запишем с ней сопоставление
if (itemUids.size()==1)
{
value.getProcessObject().setMdmId(itemUids[0]);
}
else //в противном случае отклоним сообщение
{
if (itemUids.size() == 0)
return 'В справочнике Материалов не найдено ни одной марки материала "'+SearchVal+'"';
else
return 'В справочнике Материалов найдено более одной марки материала "'+SearchVal+'"';
}
}
else
{
return 'Не указана марка материала'
}
}
else
{
return 'Не указана марка материала'
}
return null;
}
Формула импорта для атрибута “ОКПД2”:
String transformValue(ProcessObject root, ProcessedValue value) {
//Получим значение вложенного атрибута по наименования заданному для внешней системы
ProcessedValue attrVal = value.getProcessObject().getValues().find {element -> element.getName()=="КодОКПД2"};
//Удалим все вложенные значения в атрибут "ОКПД2", чтобы новый объект классификатора ОКПД2 не был создан
value.getProcessObject().getValues().clear();
//Если получили значение с кодом ОКПД2
if (attrVal!=null)
{ //Если код ОКПД2 не пустой
if (attrVal.getStringValue()!=null)
{
//Получим искомое значение кода ОКПД2 и выполним поиск в классификаторе ОКПД2
String SearchVal = attrVal.getStringValue();
List<String> itemUids = support.findInClassifier('5d7f1d1f-a94c-4ebc-938a-42accaab7658')
.byValue(SearchVal, @[Код ОКПД2].toPath())
.byStatus(ItemStatus.Standardized).invoke();
//если была найдена одна единственная группа ОКПД2 в Semantic MDM по этому коду, то запишем с ней сопоставление
if (itemUids.size()==1)
{
value.getProcessObject().setMdmId(itemUids[0]);
}
else //в противном случае отклоним сообщение, т.к. если была задана группа ОКПД2, то она должна быть в классификаторе
{
if (itemUids.size() == 0)
return 'В классификаторе ОКПД2 не найдено ни одной группы с кодом "'+SearchVal+'"';
else
return 'В классификаторе ОКПД2 найдено более одной группы с кодом "'+SearchVal+'"';
}
}
}
return null;
}