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}]
- поэтому в вашем конкретном случае замена запятой на подчеркивание должна работать.