Connection.OpenWorklistItem бросает Worklistitem не найдена ошибка в K2 Blackpearl

Немного предыстории. Я обновляю проект, который был написан кем-то, использующим k2 2003, чтобы использовать k2 Blackpearl. Процесс orignal k2 2003 имеет следующее правило назначения и клиентское событие, использующее 1 слот

public class DestinationRule_e68c062c1c8d41f5a80ba96b065f76f7 
{ 
   public void Main(ref DestinationRuleContext K2) 
   { 
     K2.ResolveQueuesToUsers = true; 
    K2.Destinations.Add(DestinationType.User, K2.ProcessInstance.Originator.FQN); 
    } 
} 


public class EventItem_5e24182cd2b9469aa5314aafaa0abeff 
{ 
  public void Main(ClientEventContext K2) 
  { 
    K2.VerifyCredentials = false; 
   try 
   {   
     K2.ProcessInstance.DataFields["CurrentSerialNo"].Value = K2.SerialNumber; 
   } 
   catch (System.Exception ex) 
   {   
     throw new System.Exception(ex.Message); 
   } 
}

Обратите внимание, что в приведенном выше коде нет вызова "K2.AddWorklist". Должно ли быть?

Процесс использует поле данных для хранения серийного номера, а затем использует серийный номер для открытия элемента рабочего списка, а затем завершает его следующим образом (используя K2ROM dll) из веб-приложения:

//using k2 2003 
  public void FinishWorkItem()


  {
        if (this.ProcessInstance != null)
        {
            if (!string.IsNullOrEmpty(this.CurrentSerialNo))
            {
                WorklistItem item = null;
                Connection connection = GetConnection();
                try
                {
                    item = connection.OpenWorklistItem(this.CurrentSerialNo, "ASP");
                }
                catch { }
                if (item != null)
                {
                    this.CurrentSerialNo = string.Empty;
                    item.Finish();
                }
            }
        }
        else
        {
            throw new Exception("Cannot finish work item where ProcessInstance is null (calling from KOProcessInstance)");
        }
    }

Обратите внимание, как OpenWorklistItem использует "this.CurrentSerialNumber", который является значением серийного номера из поля данных для открытия и завершения элемента рабочего списка. Кажется, это работает нормально в 2003 году

Я переписал этот метод для использования API BlackPearl (SourceCode.Workflow.Client.dll) следующим образом:

//same code using BlackPearl 
 public void FinishWorkItem(IClientDocumentEntity currentClientDocument)
    {
        if (this.ProcessInstance != null)
        {
            if (!string.IsNullOrEmpty(this.CurrentSerialNo))
            {
                WorklistItem item = null;
                item = connection.OpenWorklistItem(this.CurrentSerialNo,"ASP");
                if (item != null)
                {
                    if (item.Actions.Count > 0)
                    {
                        foreach (SourceCode.Workflow.Client.Action action in item.Actions)
                        {
                            if (string.Compare(action.Name, "Finish", true) == 0)
                            {
                                action.Execute();
                                break;
                            }
                        }
                    }
                    this.CurrentSerialNo = string.Empty;
                }
            }
        }
        else
        {
            throw new Exception("Cannot finish work item where ProcessInstance is null (calling from KOProcessInstance)");
        }
    }

Connection.OpenWorklistItem(this.CurrentSerialNo,"ASP") выдает следующую ошибку 26030 Элемент рабочего списка,13351,144 не найден для в

Мой вопрос заключается в том, было ли изменение поведения в вызове OpenWorklistItem с 2003 по Blackpearl? Метод "FinishWorkItem" в моем фрагменте из K2 2003, описанного выше, выполняется учетной записью, которая является "Администратором" в K2 2003, и в настоящее время он хорошо работает в Production, что заставляет меня поверить, что K2 2003 позволяет открывать WorklistItem с использованием последовательного интерфейса. номер независимо от пользователя, которому назначен элемент, и заканчивает его, если код выполняется учетной записью, которая является администратором на сервере K2 2003. Это утверждение правильно? Изменилось ли это поведение в BlackPearl? Если так, что я должен сделать по-другому, чтобы заставить вещи работать.

Кроме того, правильно хранить K2.SerialNumber в качестве поля данных в экземпляре процесса. Я не уверен, что понимаю, будет ли в поле данных несколько конечных пользователей, будет ли поле данных содержать серийный номер последнего конечного пользователя и правильно ли будет открывать элемент рабочего списка с использованием этого серийного номера.

Благодарю.

1 ответ

Изменение заключается в том, что серийный номер теперь в формате {ProcInstID}_{ActInstDestID}например "18_1". Серийные номера 2003 года были в формате {ProcInstID},{ActInstDestID}[,{EventInstID}] - поэтому в вашем конкретном случае замена запятой на подчеркивание должна работать.

Другие вопросы по тегам