1

少し背景。k2 Blackpearl を使用するために、k2 2003 を使用して誰かが作成したプロジェクトをアップグレードしています。元の 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" を使用する方法に注意してください。これは、worklistitem を開いて終了するためのデータ フィールドからのシリアル番号の値です。これは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 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 に答える