Connection.OpenWorklistItem бросает Worklistitem не найдена ошибка в K2 Blackpearl - PullRequest
1 голос
/ 04 октября 2011

Немного фона.Я обновляю проект, который был написан кем-то, использующим 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 Ответ

0 голосов
/ 04 октября 2011

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

...