...

Ограничение списка экземпляров процесса Workflow

Тема в разделе "Разработчикам", создана пользователем inteco, 3 апр 2019.

  1. inteco

    inteco Member

    Добрый день!

    Есть контекстная переменная context.VozvratPoProcessu типа "Экземпляр процесса Workflow".
    Нужно ограничить список экземпляров в этой переменной списком выбранных экземпляров.
    Пишу:
    Код:
                var filter = InterfaceActivator.Create<WorkflowInstanceFilter>();//создаем экземпляр фильтра
               var header = PublicAPI.Processes.ProcessHeader.Load(1213);//загружаем процесс в переменную в зависимости от id
                var contextFilterType = Locator.GetServiceNotNull<WorkflowInstanceContextService>().GetInstanceContextFilterType(header.Published);//задаем тип фильтра контекста
                dynamic fl = Activator.CreateInstance(contextFilterType);//создаем экземпляр фильтра по контексту
                fl.Iniciator = PublicAPI.Portal.Security.User.GetCurrentUser();//присваиваем значение переменной, по которому будет фильтровать
                filter.ContextFilter = fl;//присваиваем искомое значение фильтру
                filter.ProcessHeader = header;    //присваиваем фильтру процесс, который определили по Id
                var process = WorkflowInstanceManager.Instance.FindUsingContext(filter, null);//задаем поиск по контексту.
                //
            
                context.VozvratPoProcessu.AddAll(process);
    
    Ругается на последнюю строку:
    - Наиболее подходящий перегруженный метод для "Iesi.Collections.Generic.ISet<EleWise.ELMA.Workflow.Models.WorkflowInstance>.AddAll(System.Collections.Generic.ICollection<EleWise.ELMA.Workflow.Models.WorkflowInstance>)" имеет несколько недопустимых аргументов
    - Аргумент "1": преобразование типа из "System.Collections.Generic.ICollection<object>" в "System.Collections.Generic.ICollection<EleWise.ELMA.Workflow.Models.WorkflowInstance>" невозможно

    Как ограничить список экземпляров?
     
  2. Алекс

    Алекс Member


    Добрый день.
    context.VozvratPoProcessu - имеет тип связи Многие-ко-многим? Если так, то попробуйте
    context.VozvratPoProcessu.AddAll(process);
    заменить на
    foreach (var element in process) {
    context.VozvratPoProcessu.Add(element);
    }
     
  3. inteco

    inteco Member

    Да, имеет тип связи Многие-ко-многим.
    Попробовал,
    Ошибки:
    - Наиболее подходящий перегруженный метод для "Iesi.Collections.Generic.ISet<EleWise.ELMA.Workflow.Models.WorkflowInstance>.Add(EleWise.ELMA.Workflow.Models.WorkflowInstance)" имеет несколько недопустимых аргументов
    - Аргумент "1": преобразование типа из "object" в "EleWise.ELMA.Workflow.Models.WorkflowInstance" невозможно
     
  4. Алекс

    Алекс Member


    Может использовать поиск по EQL запросу? Например,
    var process = PublicAPI.Processes.WorkflowInstance.Find("EQL запрос");
    context.VozvratPoProcessu.AddAll(process);
    или
    //создаем фильтр для объекта с помощью помощника
    var filter = PublicAPI.Processes.WorkflowInstance.Filter().Query("Id in (1,2,3,4)").Filter;

    //используем фильтр
    var workflowinstanceList = EntityManager<WorkflowInstance>.Instance.Find(filter, null);

    //где workflowinstanceList - список полученных данных по критериям, переданным в фильтр
     
  5. inteco

    inteco Member

    Могу попробовать, но как EQL запросом сделать отбор, чтобы инициатором отобранных экземпляров был текущий пользователь?
     
  6. Алекс

    Алекс Member

    var process = PublicAPI.Processes.WorkflowInstance.Find("Initiator = CurrentUser()");

    Вот так должно сработать.
     
  7. inteco

    inteco Member

    Попробовал так, проверку проходит, но при запуске пишет:
    Не разрешается менять тип связи для свойства с типом "Объект" (свойство VozvratPoProcessu в объекте...)
     
  8. Алекс

    Алекс Member


    var process = PublicAPI.Processes.WorkflowInstance.Find("Initiator = CurrentUser() AND Process like " + '"' + context.WorkflowInstance.Process.Name.ToString() + '"').ToArray();

    foreach(var element in process)
    {
    context.VozvratPoProcessu.Add(element);
    }

    "Initiator = CurrentUser() AND Process like " + '"' + context.WorkflowInstance.Process.Name.ToString() + '"' - EQL запрос ищет все экземпляры данного процесса, которые запускал текущий пользователь. Соответственно, если надо найти экземпляры другого процесса, то запрос будет немного другим. Если опишите подробнее что именно нужно, то попробую составить запрос.
     
  9. inteco

    inteco Member

    Запрос, с вашей помощью, спасибо вам, я составил, вот:
    var process = PublicAPI.Processes.WorkflowInstance.Find("Initiator = CurrentUser() AND Name like 'Заявка на расход%'").ToArray();
    И он работает, вот так:
    foreach(var p in process)
    {
    Console.WriteLine(p.Name);//выводим названия экземпляров процесса
    //context.VozvratPoProcessu.Add(p);
    }
    и выводит список нужных мне экземпляров процессов.

    Но, вопрос не в этом, вопрос вот в этом
    context.VozvratPoProcessu.Add(p);
    Эта конструкция не работает, в режим отладки не заходит (ошибка выдается в виде сообщения на экране с кнопкой "ОК", я уже писал текст ошибки #7),
    а в режиме эмуляции список никак не ограничивается.
     
  10. Алекс

    Алекс Member


    Может Вы меняли тип связи? Изначально был тип связи Многие-ко-многим или нет? Попробуйте создать новую контекстную переменную с правильным типом связи. У меня данная конструкция отрабатывает без проблем.
     
  11. inteco

    inteco Member

    Да, был косяк с переменной context.VozvratPoProcessu.
    Изменение типа связи было доступно, но по факту менять его было уже нельзя.

    И я прошу прощения у вас Алекс, я сам ушел не туда и вас за собой увел.

    Мне нужно было ограничить список с типом связи 1-1 и пользователь должен был выбрать из этого списка единственное значение.
    Решилось это так:
    Код:
                var vozvratSettings = (EntitySettings)context.GetSettingsFor (c => c.VozvratPoProcessu1);
                vozvratSettings.FilterQuery = "Initiator = CurrentUser() AND Name like 'Заявка на расход%'";
                vozvratSettings.Save ();
    
    P.S. Вот бы еще отсортировать этот список по дате запуска процесса по убыванию...
     
  12. Алекс

    Алекс Member


    К сожалению, не знаю как отсортировать сразу в запросе.
     
  13. inteco

    inteco Member

    В фильтре:
    Код:
                var vozvratSettings = (EntitySettings)context.GetSettingsFor (c => c.VozvratPoProcessu1);
                vozvratSettings.FilterQuery = "Initiator = CurrentUser() AND Name like 'Заявка на расход%'";
                vozvratSettings.Save ();
    скорее всего, никак, тк это фильтр.

    А в отборе, например вот так:
    Код:
    var process = PublicAPI.Processes.WorkflowInstance.Find (filter).OrderByDescending (c => c.StartDate);
    Это по убыванию, а если по возрастанию, то просто OrderBy.
     
  14. Алекс

    Алекс Member

    Спасибо за информацию. Просто я думал что нужно, чтобы в выпадающем списке экземпляров процесса они сразу выстраивались в нужном порядке.
     

Поделиться: