Руководство пользователя Semantic MDM
×
Меню
Индекс

Пример решения задачи сопоставления с позицией вспомогательного справочника

 
Данный пример демонстрирует возможность выполнения программного сопоставления с классификационной группой по коду классификатора ОКПД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;
}