Example #1
0
        /// <summary>
        /// 更新流程变量
        /// </summary>
        /// <param name="sn">流程实例ID</param>
        /// <param name="nvcDataFields">要获取的变量的List</param>
        /// <returns>变量的List</returns>
        public static void GetProcessDataFields(int procInstID, CDataFields dataFields)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);

                    ProcessInstance procInst = conn.OpenProcessInstance(procInstID);
                    GetDataFields(procInst, dataFields);
                }
                catch
                {
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    { }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #2
0
        private void btnLoadPI_Click(object sender, EventArgs e)
        {
            try
            {
                Connection cnx = new Connection();
                cnx.Open(ConfigurationManager.AppSettings["K2ServerName"]);
                SourceCode.Workflow.Client.ProcessInstance pi = cnx.OpenProcessInstance(int.Parse(txtProcInstanceId.Text));
                txtFolio.Text           = pi.Folio;
                lblStatus.Text          = pi.Status1.ToString();
                txtProcessFullName.Text = pi.FullName;
                DataTable dt = new DataTable("Datafields");
                dt.Columns.Add("Name");
                dt.Columns.Add("Value");

                foreach (DataField df in pi.DataFields)
                {
                    dt.Rows.Add(new object[] { df.Name, df.Value });
                }

                displayActivity();

                dgvDatafields.DataSource = dt;
                dgvDatafields.Refresh();
                dgvDatafields.AutoResizeColumn(0);
                dgvDatafields.Columns[0].ReadOnly = true;
                dgvDatafields.AutoResizeColumn(1);

                cnx.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "PI Manager eror");
            }
        }
Example #3
0
    public void UpdateDataFields(int procInstID, Dictionary <string, string> dict)
    {
        Connection k2Conn = new Connection();

        try
        {
            k2Conn.Open(K2ServerName, WorkflowHelper.GetConnString());

            SourceCode.Workflow.Client.ProcessInstance inst = k2Conn.OpenProcessInstance(procInstID);
            if (inst != null)
            {
                foreach (string s in dict.Keys)
                {
                    inst.DataFields[s].Value = dict[s];
                }
            }
            else
            {
                Response.Redirect("ProcessesManage_List.aspx", false);
            }
            inst.Update();

            k2Conn.Close();
        }
        catch
        {
            k2Conn.Close();
        }
    }
Example #4
0
    public static bool UpdateDataFieldsByWorkflowId(int wfId, NameValueCollection nvcDataFields)
    {
        using (Connection conn = new Connection())
        {
            bool result = false;
            try
            {
                conn.Open(K2ServerName, GetConnString());
                conn.RevertUser();
                conn.ImpersonateUser(@"Founder\zybpmadmin");

                ProcessInstance inst = conn.OpenProcessInstance(wfId);
                for (int i = 0; i < nvcDataFields.Count; i++)
                {
                    inst.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i];
                }
                inst.Update();

                result = true;
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(result);
        }
    }
Example #5
0
    /// <summary>
    /// 是否DataField
    /// </summary>
    /// <param name="procInstID"></param>
    /// <returns></returns>
    bool ExistDataField(int procInstID)
    {
        bool       flag   = false;
        Connection k2Conn = new Connection();

        try
        {
            k2Conn.Open(K2ServerName, WorkflowHelper.GetConnString());
            SourceCode.Workflow.Client.ProcessInstance inst = k2Conn.OpenProcessInstance(procInstID);
            if (inst != null)
            {
                foreach (DataField item in inst.DataFields)
                {
                    if (item.Name == "IsPass")
                    {
                        flag = true;
                        break;
                    }
                }
            }
            k2Conn.Close();
        }
        catch
        {
            k2Conn.Close();
        }
        return(flag);
    }
Example #6
0
    /// <summary>
    /// 绑定默认DataFields
    /// </summary>
    /// <param name="procInstID"></param>
    private void LoadDataFields(int procInstID)
    {
        List <BPMListItem> items  = new List <BPMListItem>();
        Connection         k2Conn = new Connection();

        try
        {
            k2Conn.Open(K2ServerName, WorkflowHelper.GetConnString());
            SourceCode.Workflow.Client.ProcessInstance inst = k2Conn.OpenProcessInstance(procInstID);
            if (inst != null)
            {
                foreach (DataField df in inst.DataFields)
                {
                    items.Add(new BPMListItem {
                        Name = df.Name, Value = df.Value.ToString()
                    });
                }
                rptList.DataSource = items;
                rptList.DataBind();

                k2Conn.Close();
            }
            else
            {
                k2Conn.Close();
            }
        }
        catch (Exception ex)
        {
            k2Conn.Close();
            lblException.Text    = "异常信息:" + ex.Message;
            lblException.Visible = true;
        }
    }
Example #7
0
    public static bool ModifyDataField(string sn, NameValueCollection dataFields)
    {
        Connection k2Conn = new Connection();

        try
        {
            k2Conn.Open(K2ServerName, WorkflowHelper.GetConnString());

            SourceCode.Workflow.Client.ProcessInstance inst = k2Conn.OpenProcessInstance(Convert.ToInt32(sn.Split('_')[0]));
            if (inst != null)
            {
                foreach (string s in dataFields)
                {
                    inst.DataFields[s].Value = dataFields[s];
                }

                inst.Update();
            }
            return(true);
        }
        catch (Exception ex)
        {
            return(false);
        }
        finally
        {
            k2Conn.Close();
        }
    }
Example #8
0
        private void btnLoadPI_Click(object sender, EventArgs e)
        {
            try
            {
                Connection cnx = new Connection();
                cnx.Open(ConfigurationManager.AppSettings["K2ServerName"]);
                SourceCode.Workflow.Client.ProcessInstance pi = cnx.OpenProcessInstance(int.Parse(txtProcInstanceId.Text));
                txtFolio.Text = pi.Folio;
                lblStatus.Text = pi.Status1.ToString();
                txtProcessFullName.Text = pi.FullName;
                DataTable dt = new DataTable("Datafields");
                dt.Columns.Add("Name");
                dt.Columns.Add("Value");

                foreach (DataField df in pi.DataFields)
                {
                    dt.Rows.Add(new object[] { df.Name, df.Value });
                }

                displayActivity();

                dgvDatafields.DataSource = dt;
                dgvDatafields.Refresh();
                dgvDatafields.AutoResizeColumn(0);
                dgvDatafields.Columns[0].ReadOnly = true;
                dgvDatafields.AutoResizeColumn(1);

                cnx.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "PI Manager eror");
            }
        }
        //add comments samples
        public static void AddCommentsSamples()
        {
            using (Connection K2Conn = new Connection())
            {
                //dummy values for process instance ID and activity instance ID
                int processInstanceId             = 1;
                int activityInstanceDestinationID = 10;

                //adding a comment
                //Add a Comment using the Connection class and the Process Instance's ID
                IWorkflowComment comment = K2Conn.AddComment(processInstanceId, "Hello World");

                //Add a Comment using the Connection class and the Worklist Item's SerialNumber
                IWorkflowComment comment2 = K2Conn.AddComment("[_serialNo]", "Hello World");

                //Add a Comment using the Connection class and the Process Instance's ID and Activity Instance Destination's ID
                IWorkflowComment comment3 = K2Conn.AddComment(processInstanceId, activityInstanceDestinationID, "Hello World");

                //Add a Comment using the Process Instance
                ProcessInstance  procinst        = K2Conn.OpenProcessInstance(processInstanceId);
                IWorkflowComment procInstComment = procinst.AddComment("Hello World");

                //Add a Comment using the WorklistItem
                WorklistItem     worklistItem  = K2Conn.OpenWorklistItem("[_serialNo]");
                IWorkflowComment WLItemComment = worklistItem.AddComment("Hello World");
            }
        }
        //add attachments samples
        public static void AddAttachmentsSamples()
        {
            using (Connection K2Conn = new Connection())
            {
                //dummy values for process instance ID and activity instance ID
                int    processInstanceId             = 1;
                int    activityInstanceDestinationID = 10;
                string fileName = "Report1.pdf";

                //Add an Attachment using the Connection class and the Process Instance's ID
                IWorkflowAttachment _attachment = K2Conn.AddAttachment(processInstanceId, fileName, GetFile("Report1.pdf"));

                //Add an Attachment using the Connection class and the Worklist Item's SerialNumber
                IWorkflowAttachment _attachment1 = K2Conn.AddAttachment("[_serialNo]", fileName, GetFile("Report1.pdf"));

                //Add an Attachment using the Connection class and the Process Instance's ID and Activity Instance Destination's ID
                IWorkflowAttachment _attachment2 = K2Conn.AddAttachment(processInstanceId, activityInstanceDestinationID, fileName, GetFile("Report1.pdf"));

                //Add an Attachment using the Process Instance
                ProcessInstance     _processInstance = K2Conn.OpenProcessInstance(processInstanceId);
                IWorkflowAttachment _attachment3     = _processInstance.AddAttachment(fileName, GetFile("Report1.pdf"));

                //Add an Attachment using the WorklistItem
                WorklistItem        _worklistItem = K2Conn.OpenWorklistItem("[_serialNo]");
                IWorkflowAttachment _attachment4  = _worklistItem.AddAttachment(fileName, GetFile("Report1.pdf"));

                //Async exampe, where you create the attachment first and then upload the file
                //Add an 'empty' attachment
                IWorkflowAttachment _attachment5 = K2Conn.AddAttachment(processInstanceId, fileName, null);
                //now upload the attachment's file.
                //Note. You can only upload the file once and only for an 'empty' attachment.
                //Note. This can be used for async purposes, to create the metadata first and secondly upload the file.
                IAttachment attachmentWithContent = K2Conn.UploadAttachmentContent(_attachment.Id, GetFile("Report1.pdf"));
            }
        }
Example #11
0
    public static NameValueCollection GetProcessInstanceAllDataFields(int processInstID)
    {
        NameValueCollection dataFields = new NameValueCollection();

        using (Connection conn = new Connection())
        {
            ProcessInstance inst = null;
            try
            {
                conn.Open(K2ServerName, GetConnString());

                inst = conn.OpenProcessInstance(processInstID);

                foreach (DataField item in inst.DataFields)
                {
                    dataFields.Add(item.Name, item.Value.ToString());
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(dataFields);
        }
    }
Example #12
0
 public K2.ProcessInstance GetProcessInstance(int instId)
 {
     using (Connection workflowClient = this.GetWorkflowClient())
     {
         return(workflowClient.OpenProcessInstance(instId));
     }
 }
 protected override void ProcessRecord()
 {
     try
     {
         var procInst = _connection.OpenProcessInstance(ProcInstId);
         procInst.Folio = Folio;
         procInst.Update();
     }
     catch (Exception ex)
     {
         ErrorHelper.Write(ex);
     }
 }
 protected override void ProcessRecord()
 {
     try
     {
         var procInst   = _connection.OpenProcessInstance(ProcInstId);
         var dataFields = procInst.DataFields;
         dataFields[DataFieldName].Value = DataFieldValue;
         procInst.Update();
     }
     catch (Exception ex)
     {
         ErrorHelper.Write(ex);
     }
 }
Example #15
0
    /// <summary>
    /// 是否存在实例
    /// </summary>
    /// <param name="procInstID"></param>
    /// <returns></returns>
    bool ExistprocInst(int procInstID)
    {
        Connection k2Conn = new Connection();

        try
        {
            k2Conn.Open(K2ServerName, WorkflowHelper.GetConnString());
            SourceCode.Workflow.Client.ProcessInstance inst = k2Conn.OpenProcessInstance(procInstID);
            k2Conn.Close();
            return(inst != null);
        }
        catch
        {
            k2Conn.Close();
            return(false);
        }
    }
Example #16
0
    /// <summary>
    /// update some data field of the current process
    /// </summary>
    /// <param name="sm">update some data field</param>
    /// <param name="list">new data field value</param>
    /// <returns>is success</returns>
    public static bool UpdateDataFields(string sn, NameValueCollection nvcDataFields, string currentUser)
    {
        using (Connection conn = new Connection())
        {
            bool result = false;
            try
            {
                conn.Open(K2ServerName, GetConnString());
                conn.RevertUser();
                if (currentUser == "")
                {
                    conn.ImpersonateUser(CurrentUser);
                }
                else
                {
                    conn.ImpersonateUser(currentUser);
                }


                //WorklistItem wlItem = wlItem = conn.OpenWorklistItem(sn);
                //for (int i = 0; i < nvcDataFields.Count; i++)
                //{
                //    wlItem.ProcessInstance.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i];
                //}
                //wlItem.ProcessInstance.Update();

                ProcessInstance inst = conn.OpenProcessInstance(Convert.ToInt32(sn.Split('_')[0]));
                for (int i = 0; i < nvcDataFields.Count; i++)
                {
                    inst.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i];
                }
                inst.Update();

                result = true;
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(result);
        }
    }
Example #17
0
    /// <summary>
    /// 获得流程实例
    /// </summary>
    /// <param name="processInstID"></param>
    /// <returns></returns>
    public static ProcessInstance GetProcessInstance(int processInstID)
    {
        using (Connection conn = new Connection())
        {
            ProcessInstance inst = null;
            try
            {
                conn.Open(K2ServerName, GetConnString());

                inst = conn.OpenProcessInstance(processInstID);
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(inst);
        }
    }
Example #18
0
    /// <summary>
    /// 获取实例的datafield
    /// </summary>
    /// <param name="processInstID"></param>
    /// <param name="dfName"></param>
    /// <returns></returns>
    public static string GetProcessInstanceDataField(int processInstID, string dfName)
    {
        using (Connection conn = new Connection())
        {
            ProcessInstance inst = null;
            try
            {
                conn.Open(K2ServerName, GetConnString());

                inst = conn.OpenProcessInstance(processInstID);

                return(inst.DataFields["dfName"].Value.ToString());
            }
            catch
            {
            }
            finally
            {
                conn.Close();
            }
            return("");
        }
    }
        //retrieve comments samples
        public static void GetCommentsSamples()
        {
            using (Connection K2Conn = new Connection())
            {
                //dummy values for process instance ID and activity instance ID
                int processInstanceId             = 1;
                int activityInstanceDestinationID = 10;

                //retrieve comments for a workflow instance in different ways
                //Get all the Comments using the Process Instance's ID
                IEnumerable <IWorkflowComment> comments = K2Conn.GetComments("[ProcessInstanceID]");
                foreach (IWorkflowComment comment1 in comments)
                {
                    Console.WriteLine(comment1.Message);
                }

                //Get all the Comments using a Worklist Item's SerialNumber
                IEnumerable <IWorkflowComment> comments1 = K2Conn.GetComments("[serialnumber]");


                //Get all the Comments using a Process Instance's ID and Activity Instance Destination's ID
                IEnumerable <IWorkflowComment> comments2 = K2Conn.GetComments(processInstanceId, activityInstanceDestinationID);

                //Get all the Comments from the Process Instance's 'Comments' property
                ProcessInstance _processInstance = K2Conn.OpenProcessInstance(processInstanceId);
                IEnumerable <IWorkflowComment> procInstComments = _processInstance.Comments;
                foreach (IWorkflowComment comments3 in procInstComments)
                {
                    Console.WriteLine(comments3.Message);
                }

                //Get all the Comments from the Worklist Item's 'Comments' property
                WorklistItem _worklistItem = K2Conn.OpenWorklistItem("[_serialNo]");
                IEnumerable <IWorkflowComment> WLItemComments = _worklistItem.Comments;
            }
        }
Example #20
0
        /// <summary>
        /// 审批流程
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="sn"></param>
        /// <param name="actionString"></param>
        /// <param name="memo"></param>
        /// <param name="dataFields"></param>
        public WorklistItem ApprovalProcess(string userName, string sn, string actionString, string memo, Dictionary <string, string> dataFields)
        {
            Connection k2Connection = new Connection();

            try
            {
                k2Connection.Open(ConfigurationBase.Web.K2Server, ConfigurationBase.Web.K2LoginString);
                k2Connection.ImpersonateUser(userName);

                //根据SN打开工作项
                WorklistItem workList = k2Connection.OpenWorklistItem(sn);

                if (workList != null)
                {
                    #region 更新Datafield
                    if (dataFields != null && dataFields.Count > 0)
                    {
                        ProcessInstance currentProcessInst = k2Connection.OpenProcessInstance(workList.ProcessInstance.ID);
                        //更新Datafields
                        foreach (string key in dataFields.Keys)
                        {
                            if (currentProcessInst.DataFields[key] != null)
                            {
                                if (currentProcessInst.DataFields[key].Value != dataFields[key])
                                {
                                    currentProcessInst.DataFields[key].Value = dataFields[key];
                                }
                            }
                        }
                        currentProcessInst.Update();
                    }
                    #endregion

                    #region 审批任务
                    //批量审批没有actionString,默认第一个操作
                    if (string.IsNullOrEmpty(actionString))
                    {
                        if (workList.Actions[0].Name == REJECTACTION)
                        {
                            workList.GotoActivity("流程未通过");
                        }
                        else if (workList.Actions[0].Name == UNDOACTION)
                        {
                            workList.GotoActivity("流程撤销");
                        }
                        else
                        {
                            workList.Actions[0].Execute();
                        }
                    }
                    else
                    {
                        //执行匹配的操作
                        if (actionString == UNDOACTION)
                        {
                            workList.GotoActivity("流程撤销");
                        }
                        else if (actionString == REJECTACTION)
                        {
                            workList.GotoActivity("流程未通过");
                        }
                        else
                        {
                            bool isExcuted = false;
                            for (int i = 0; i < workList.Actions.Count; i++)
                            {
                                if (workList.Actions[i].Name == actionString)
                                {
                                    workList.Actions[i].Execute();
                                    isExcuted = true;
                                    break;
                                }
                            }
                        }
                    }
                    #endregion
                }

                return(workList);
            }
            catch (Exception)
            {
                return(null);
            }
            finally
            {
                if (k2Connection != null)
                {
                    k2Connection.Close();
                }
            }
        }
        //retrieve attachments samples
        public static void GetAttachmentsSamples()
        {
            using (Connection K2Conn = new Connection())
            {
                //dummy values for process instance ID and activity instance ID
                int processInstanceId             = 1;
                int activityInstanceDestinationID = 10;

                //Get all the Attachments using the Process Instance's ID
                //By default this call will always return the attachment's files.
                IEnumerable <IWorkflowAttachment> attachments = K2Conn.GetAttachments(processInstanceId);
                foreach (IWorkflowAttachment attachment1 in attachments)
                {
                    //retrieve the attachment file into an IO stream
                    System.IO.Stream fileContents = attachment1.GetFile();
                }

                //Get all the Attachments using the SerialNumber
                //By default this call will always return the attachment's files.
                IEnumerable <IWorkflowAttachment> attachments2 = K2Conn.GetAttachments("[_serialNo]");

                //Get all the Attachments using the Process Instance's ID and Activity Instance Destination's ID
                //By default this call will always return the attachment's files.
                IEnumerable <IWorkflowAttachment> attachments3 = K2Conn.GetAttachments(processInstanceId, activityInstanceDestinationID);

                //Get all the Attachments from the Process Instance's 'Attachments' property
                ProcessInstance _processInstance = K2Conn.OpenProcessInstance(processInstanceId);
                IEnumerable <IWorkflowAttachment> procInstAttachments = _processInstance.Attachments;

                //Get all the Attachments from the Worklist Item's 'Attachments' property
                WorklistItem _worklistItem = K2Conn.OpenWorklistItem("[_serialNo]");
                IEnumerable <IWorkflowAttachment> WLItemAttachments = _worklistItem.Attachments;

                //Get the Attachment by passing the Attachment's ID
                //By default this call will always return the attachment's file.
                int attachmentId = 1;
                IWorkflowAttachment attachment = K2Conn.GetAttachment(attachmentId);
                //save the attachment.
                SaveFile(attachment.FileName, attachment.GetFile());

                //Get the Attachment by passing the Attachment's ID
                //pass 'false' for the includeFile parameter to only load the file on demand.
                IWorkflowAttachment attachmentNoFile = K2Conn.GetAttachment(attachmentId, false);

                //Get all the Attachments using the Process Instance's ID and Activity Instance Destination's ID
                //pass 'false' for the includeFile parameter to only load the file on demand.
                IEnumerable <IWorkflowAttachment> attachments4 = K2Conn.GetAttachments(processInstanceId, activityInstanceDestinationID, false);

                //Iterate through the attachments
                foreach (IAttachment attachment4 in attachments4)
                {
                    //only get specific user's attachments
                    if (attachment4.FQN.Equals(@"K2:Denallix\Bob"))
                    {
                        //use the attachment.GetFile() method to load the attachment's file and cache it.
                        using (System.IO.Stream downloadStream = attachment.GetFile())
                        {
                            SaveFile(attachment.FileName, downloadStream);
                        }
                    }
                }
            }
        }
Example #22
0
        /// <summary>
        /// 审批流程
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="sn"></param>
        /// <param name="actionString"></param>
        /// <param name="memo"></param>
        /// <param name="dataFields"></param>
        public WorklistItem ApprovalProcess(string userName, string sn, string actionString, string memo, Dictionary<string, string> dataFields)
        {
            Connection k2Connection = new Connection();

            try
            {
                k2Connection.Open(ConfigurationBase.Web.K2Server, ConfigurationBase.Web.K2LoginString);
                k2Connection.ImpersonateUser(userName);

                //根据SN打开工作项
                WorklistItem workList = k2Connection.OpenWorklistItem(sn);

                if (workList != null)
                {
                    #region 更新Datafield
                    if (dataFields != null && dataFields.Count > 0)
                    {
                        ProcessInstance currentProcessInst = k2Connection.OpenProcessInstance(workList.ProcessInstance.ID);
                        //更新Datafields
                        foreach (string key in dataFields.Keys)
                        {
                            if (currentProcessInst.DataFields[key] != null)
                            {
                                if (currentProcessInst.DataFields[key].Value!= dataFields[key])
                                {
                                    currentProcessInst.DataFields[key].Value = dataFields[key];
                                }
                            }
                        }
                        currentProcessInst.Update();
                    }
                    #endregion

                    #region 审批任务
                    //批量审批没有actionString,默认第一个操作
                    if (string.IsNullOrEmpty(actionString))
                    {
                        if (workList.Actions[0].Name == REJECTACTION)
                        {
                            workList.GotoActivity("流程未通过");
                        }
                        else if (workList.Actions[0].Name == UNDOACTION)
                        {
                            workList.GotoActivity("流程撤销");
                        }
                        else
                        {
                            workList.Actions[0].Execute();
                        }
                    }
                    else
                    {
                        //执行匹配的操作
                        if (actionString == UNDOACTION)
                        {
                            workList.GotoActivity("流程撤销");
                        }
                        else if (actionString == REJECTACTION)
                        {
                            workList.GotoActivity("流程未通过");
                        }
                        else
                        {
                            bool isExcuted = false;
                            for (int i = 0; i < workList.Actions.Count; i++)
                            {
                                if (workList.Actions[i].Name == actionString)
                                {
                                    workList.Actions[i].Execute();
                                    isExcuted = true;
                                    break;
                                }
                            }
                        }
                    }
                    #endregion
                }

                return workList;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                if (k2Connection != null)
                {
                    k2Connection.Close();
                }
            }
        }
Example #23
0
        /// <summary>
        /// 供代理服务使用
        /// </summary>
        public static void DelegateWorkList()
        {
            try
            {
                //删除已经过期的代理规则
                K2DBHelper.DeleteExpiredDelegations();

                //获取有效的代理规则
                DataTable DelegationRules = K2DBHelper.GetActiveDelegations().Tables[0];

                if (DelegationRules != null && DelegationRules.Rows.Count > 0)
                {
                    using (Connection conn = new Connection())
                    {
                        try
                        {
                            ConnectionSetup conSetup = GetConnectionSetup();
                            conn.Open(conSetup);

                            foreach (DataRow DelegateRule in DelegationRules.Rows)
                            {
                                //获取被代理人的WorkList
                                conn.ImpersonateUser(DelegateRule["FromUserAD"].ToString());
                                Worklist delegateFromWorkList = conn.OpenWorklist();

                                if (delegateFromWorkList != null && delegateFromWorkList.Count > 0)
                                {
                                    foreach (WorklistItem listItem in delegateFromWorkList)
                                    {
                                        //选择状态为Available和Open状态的任务
                                        if (listItem.Status == WorklistStatus.Available || listItem.Status == WorklistStatus.Open)
                                        {
                                            //获取该任务的主流程实例ID
                                            int parentProcInstID = K2DBHelper.GetRootParentsID(listItem.ProcessInstance.ID);
                                            //获取该任务的主流程实例
                                            ProcessInstance inst = conn.OpenProcessInstance(parentProcInstID);
                                            //代理规则中设置的主流程的名称
                                            string delagetionType = DelegateRule["ProcessFullName"].ToString();
                                            //如果代理规则设置的流程名称为All或等主流程的名称
                                            if (delagetionType.Equals("ALL", StringComparison.InvariantCultureIgnoreCase) || delagetionType.Equals(inst.FullName, StringComparison.InvariantCultureIgnoreCase))
                                            {
                                                bool   ContainsTargetUser = false;
                                                string targetUserSL       = SecurityLabelName + ":" + DelegateRule["ToUserAD"].ToString();

                                                //重置任务状态为Available,只有Available状态下的任务才有权限代理
                                                listItem.Release();
                                                //判断该任务是否已经代理给targetUser
                                                foreach (Destination destuser in listItem.DelegatedUsers)
                                                {
                                                    if (destuser.Name.Equals(targetUserSL, StringComparison.InvariantCultureIgnoreCase))
                                                    {
                                                        ContainsTargetUser = true;
                                                        break;
                                                    }
                                                }
                                                if (!ContainsTargetUser)
                                                {
                                                    //如果该任务是其它人代理给sourceUser的,则sourceUser不能再次代理给targetUser,即禁止传递代理
                                                    DataTable DelegationLog = K2DBHelper.GetDelegationsLog(listItem.SerialNumber).Tables[0];
                                                    foreach (DataRow dr in DelegationLog.Rows)
                                                    {
                                                        if (DelegateRule["FromUserAD"].ToString().Equals(dr["ToUser"].ToString(), StringComparison.InvariantCultureIgnoreCase))
                                                        {
                                                            ContainsTargetUser = true;
                                                            break;
                                                        }
                                                    }
                                                }
                                                if (!ContainsTargetUser)
                                                {
                                                    Destination dest = new Destination();
                                                    dest.DestinationType = DestinationType.User;
                                                    for (int i = 0; i < listItem.Actions.Count; i++)
                                                    {
                                                        dest.AllowedActions.Add(listItem.Actions[i].Name);
                                                    }
                                                    dest.Name = targetUserSL;
                                                    //任务代理
                                                    listItem.Delegate(dest);

                                                    //Todo:给代理人邮件

                                                    //Todo:添加代理历史记录
                                                    K2DBHelper.AddDelegationsLog(listItem.ProcessInstance.ID, parentProcInstID, listItem.SerialNumber, DelegateRule["FromUserAD"].ToString(), DelegateRule["ToUserAD"].ToString(), "Server");
                                                }
                                            }
                                        }
                                    }
                                }
                                conn.RevertUser();
                            }
                        }
                        catch
                        {
                            // TODO: throw?
                            throw;
                        }
                        finally
                        {
                            try
                            {
                                conn.RevertUser();
                            }
                            catch
                            {
                                throw;
                            }

                            if (conn != null)
                            {
                                conn.Close();
                            }
                        }
                    }
                }
            }
            catch
            {
                // TODO: throw?
                throw;
            }
        }