1

一点背景。我正在升级一个使用 k2 2003 编写的项目以使用 k2 Blackpearl。原始 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”。应该有吗?

该过程使用数据字段存储序列号,然后使用序列号打开工作列表项,然后从 Web 应用程序完成它(使用 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 年运行良好

我重写了这个方法来使用 BlackPearl API(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 Worklist item ,13351,144 not found for at

我的问题是从 2003 年到 Blackpearl 的 OpenWorklistItem 调用中的行为是否发生了变化?上面 K2 2003 片段中的“FinishWorkItem”方法由 K2 2003 中的“管理员”帐户执行,目前在生产环境中似乎工作正常,这让我相信 K2 2003 允许使用串行打开 WorklistItem如果代码由 K2 2003 服务器上的管理员帐户执行,则无论该项目分配给哪个用户并完成它。这个说法正确吗?BlackPearl 中的这种行为是否发生了变化?如果是这样,我应该做些什么不同的事情来使事情正常进行。

此外,将 K2.SerialNumber 作为数据字段存储在流程实例中是正确的做法。我不确定我是否了解如果有多个目标用户,数据字段是否会包含最后一个目标用户的序列号,以及使用此序列号打开工作列表项是否正确。

谢谢。

4

1 回答 1

0

变化是序列号现在是格式{ProcInstID}_{ActInstDestID},例如'18_1'。2003 年的序列号采用格式{ProcInstID},{ActInstDestID}[,{EventInstID}]- 因此在您的特定情况下,用下划线替换逗号应该有效。

于 2011-10-04T09:50:24.287 回答