Example #1
0
        /// <summary>
        /// 更新流程变量
        /// </summary>
        /// <param name="sn">流程SN</param>
        /// <param name="nvcDataFields">要更新的变量</param>
        public static void UpdateProcessDataFields(string sn, string currentUser, CDataFields dataFields)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.RevertUser();
                    conn.ImpersonateUser(currentUser);

                    WorklistItem listItem = conn.OpenWorklistItem(sn);
                    SetDataFields(listItem, dataFields);
                    listItem.ProcessInstance.Update();
                }
                catch
                {
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    { }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #2
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 #3
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 #4
0
    public static bool GetActivityDataField(string sn, string fieldName, string UserAccount, out string value)
    {
        using (Connection conn = new Connection())
        {
            try
            {
                conn.Open(K2ServerName, GetConnString());
                conn.RevertUser();
                conn.ImpersonateUser(UserAccount);
                WorklistItem wlItem = conn.OpenWorklistItem(sn);
                value = wlItem.ActivityInstanceDestination.DataFields[fieldName].Value.ToString();

                return(true);
            }
            catch
            {
                value = "";
                return(false);
            }
            finally
            {
                conn.Close();
            }
        }
    }
Example #5
0
    /// <summary>
    /// strat process instance
    /// </summary>
    /// <param name="processName">process full name</param>
    /// <param name="folio">process folio</param>
    /// <param name="nvcDataFields">process data fields</param>
    /// <returns>start process instance successfully or not</returns>
    public static bool StartProcess(string processName, string folio, NameValueCollection nvcDataFields)
    {
        using (Connection conn = new Connection())
        {
            bool result = false;
            try
            {
                conn.Open(K2ServerName, GetConnString());

                conn.RevertUser();
                conn.ImpersonateUser(CurrentUser);

                ProcessInstance procInst = conn.CreateProcessInstance(processName);
                if (nvcDataFields != null)
                {
                    for (int i = 0; i < nvcDataFields.Count; i++)
                    {
                        procInst.DataFields[nvcDataFields.GetKey(i)].Value = nvcDataFields[i];
                    }
                }
                procInst.Folio = folio;
                conn.StartProcessInstance(procInst);
                result = true;
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(result);
        }
    }
Example #6
0
        public static void Sleep(string sn, int second)
        {
            SourceCode.Workflow.Client.Connection con = new Connection();
            try
            {
                ConnectionSetup conSetup = GetConnectionSetup();
                con.Open(conSetup);
                con.ImpersonateUser(_CurrentUser);

                SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn);
                listItem.Sleep(true, second);
            }
            catch (Exception ex)
            {
                // TODO: throw?
                throw ex;
            }
            finally
            {
                try
                {
                    con.RevertUser();
                }
                catch
                {
                    throw;
                }

                if (con != null)
                {
                    con.Close();
                }
            }
        }
Example #7
0
    public static bool ApproveProcess(string sn, string action, string currentUser)
    {
        using (Connection conn = new Connection())
        {
            bool result = false;
            try
            {
                conn.Open(K2ServerName, GetConnString());

                conn.RevertUser();
                conn.ImpersonateUser(currentUser);
                WorklistItem wlItem = conn.OpenWorklistItem(sn);
                wlItem.Actions[action].Execute();
                result = true;
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(result);
        }
    }
Example #8
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="sn"></param>
 /// <param name="FieldNames"></param>
 /// <returns></returns>
 public static Dictionary <string, string> GetDataField(string sn, string[] FieldNames, string UserAccount)
 {
     using (Connection conn = new Connection())
     {
         try
         {
             conn.Open(K2ServerName, GetConnString());
             conn.RevertUser();
             conn.ImpersonateUser(UserAccount);
             WorklistItem wlItem = wlItem = conn.OpenWorklistItem(sn);
             Dictionary <string, string> dictionary = new Dictionary <string, string>();
             foreach (string fieldName in FieldNames)
             {
                 dictionary.Add(fieldName, wlItem.ProcessInstance.DataFields[fieldName].Value.ToString());
             }
             return(dictionary);
         }
         catch
         {
             throw;
         }
         finally
         {
             conn.Close();
         }
     }
 }
Example #9
0
    /// <summary>
    /// 加签
    /// </summary>
    /// <param name="sn"></param>
    /// <param name="Account"></param>
    /// <param name="nextUser"></param>
    public static void ForwardToNextApprover(string sn, string Account, string nextUser)
    {
        using (Connection conn = new Connection())
        {
            try
            {
                conn.Open(K2ServerName, GetConnString());
                conn.RevertUser();
                conn.ImpersonateUser(Account);

                WorklistItem wli = conn.OpenWorklistItem(sn);

                string addApproversBy = wli.ActivityInstanceDestination.DataFields["AddApproversBy"].Value.ToString();

                addApproversBy += Account + ";";

                wli.ActivityInstanceDestination.DataFields["AddApproversBy"].Value = addApproversBy;
                wli.Actions["更新"].Execute();
                wli.Redirect(nextUser);
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
        }
    }
Example #10
0
    /// <summary>
    /// 获取反加签处理人
    /// </summary>
    /// <param name="sn"></param>
    /// <param name="Account"></param>
    public static string GetBackToPreApproverUser(string sn, string Account)
    {
        using (Connection conn = new Connection())
        {
            try
            {
                conn.Open(K2ServerName, GetConnString());
                conn.RevertUser();
                conn.ImpersonateUser(Account);

                WorklistItem wli = conn.OpenWorklistItem(sn);

                string addApproversBy = wli.ActivityInstanceDestination.DataFields["AddApproversBy"].Value.ToString();

                string[] arrPreApprovers = addApproversBy.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);

                string lastPreApprover = arrPreApprovers[arrPreApprovers.Length - 1];

                return(lastPreApprover);
            }
            catch
            {
                return("");
            }
            finally
            {
                conn.Close();
            }
        }
    }
Example #11
0
        /// <summary>
        /// 审批流程
        /// </summary>
        /// <param name="sn">流程SN,必选</param>
        /// <param name="action">流程操作,为空则默认执行第0个操作</param>
        /// <param name="folio">流程编码,可选</param>
        /// <param name="dataFields">流程变量,必选</param>
        public static void ExecuteProcess(string sn, string action, string folio, string currentUser, CDataFields dataFields)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.RevertUser();
                    conn.ImpersonateUser(currentUser);

                    SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn);
                    SetDataFields(listItem, dataFields);
                    if (!string.IsNullOrEmpty(folio))
                    {
                        listItem.ProcessInstance.Folio = folio;
                    }
                    if (!string.IsNullOrEmpty(action))
                    {
                        listItem.Actions[action].Execute();
                    }
                    else
                    {
                        listItem.Actions[0].Execute();
                    }
                }
                catch
                {
                    // TODO: throw?
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    { }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #12
0
        /// <summary>
        /// 发起流程
        /// </summary>
        /// <param name="processName">流程名称:Project\Process1</param>
        /// <param name="folio">流程编码</param>
        /// <param name="nvcDataFields">流程变量</param>
        /// <returns>流程实例ID</returns>
        public static int StartProcess(string processName, string currentUser, string folio, CDataFields dataFields)
        {
            using (Connection conn = new Connection())
            {
                int procInstID = -1;
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.RevertUser();
                    conn.ImpersonateUser(currentUser);

                    ProcessInstance procInst = conn.CreateProcessInstance(processName);
                    SetDataFields(procInst, dataFields);
                    if (string.IsNullOrEmpty(folio))
                    {
                        folio = System.DateTime.Now.ToString();
                    }
                    procInst.Folio = folio;
                    conn.StartProcessInstance(procInst);
                    procInstID = procInst.ID;
                }
                catch
                {
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    { }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
                return(procInstID);
            }
        }
Example #13
0
        public ResultModel ReAssign(string sn, int assignFrom, int assignTo, out string activityName, out string processCode, out int procInstID)
        {
            Connection   k2Connect = null;
            WorklistItem workList  = null;
            ResultModel  jr        = new ResultModel()
            {
                Code = ResultCode.Fail
            };

            activityName = string.Empty;
            processCode  = string.Empty;
            procInstID   = 0;
            try
            {
                k2Connect = new Connection();
                k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]);
                k2Connect.ImpersonateUser(SecurityLable(assignFrom.ToString()));
                workList = k2Connect.OpenWorklistItem(sn);
                if (workList != null)
                {
                    workList.Redirect(SecurityLable(assignTo.ToString()));
                    jr.Code      = ResultCode.Sucess;
                    jr.Msg       = "";
                    activityName = workList.ActivityInstanceDestination.Name;
                    processCode  = workList.ProcessInstance.DataFields["ProcessCode"].Value.ToString();
                    procInstID   = workList.ProcessInstance.ID;
                }
            }
            catch (Exception ex)
            {
                jr.Msg = ex.Message;
            }
            finally
            {
                if (workList != null)
                {
                    if (workList.Status == WorklistStatus.Open)
                    {
                        try
                        {
                            k2Connect.RevertUser();
                            workList.Release();
                        }
                        catch { }
                    }
                }
                if (k2Connect != null)
                {
                    k2Connect.Close();
                }
            }
            return(jr);
        }
Example #14
0
        public static void GetSCFProcessInfo(string sn, ref string FormID, ref string ProcessID, ref string activityName, ref string approveXML)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    conn.Open(K2ServerName, GetConnString());
                    conn.RevertUser();
                    conn.ImpersonateUser(CurrentUser);
                    WorklistItem wlItem = conn.OpenWorklistItem(sn);
                    //edit by lee 2011-06-15
                    FormID    = wlItem.ProcessInstance.Folio;
                    ProcessID = wlItem.ProcessInstance.ID.ToString();
                    //ProcessID = wlItem.ProcessInstance.DataFields["ProcessID"].Value.ToString();
                    //if (wlItem.ProcessInstance.DataFields["ApprovalXML"] != null)
                    //    approveXML = wlItem.ProcessInstance.DataFields["ApprovalXML"].Value.ToString();
                    activityName = wlItem.ActivityInstanceDestination.Name;

                    //添加获取自定义流程XML方法
                    //foreach (DataField dataField in wlItem.ProcessInstance.DataFields)
                    //{
                    //    if (dataField.Name == "ApprovalXML")
                    //    {
                    //        approveXML = dataField.Value.ToString();
                    //        break;
                    //    }
                    //}

                    if (wlItem.ProcessInstance.DataFields.Count > 0)
                    {
                        approveXML = wlItem.ProcessInstance.DataFields[0].Value.ToString();
                    }
                    else
                    {
                        approveXML = string.Empty;
                    }
                }
                catch
                {
                    throw;
                }
                finally
                {
                    conn.Close();
                }
            }
        }
Example #15
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 #16
0
        public static void Delegate(string sn, string targetUser)
        {
            SourceCode.Workflow.Client.Connection con = new Connection();
            try
            {
                ConnectionSetup conSetup = GetConnectionSetup();
                con.Open(conSetup);
                con.ImpersonateUser(_CurrentUser);

                SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn);
                listItem.Release();

                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 = targetUser;

                listItem.Delegate(dest);
                DBManager.AddWorkListLog(_CurrentUser, targetUser, listItem.SerialNumber, listItem.ProcessInstance.ID, listItem.ActivityInstanceDestination.ID, "Delegate", _CurrentUser);
            }
            catch (Exception ex)
            {
                // TODO: throw?
                throw ex;
            }
            finally
            {
                try
                {
                    con.RevertUser();
                }
                catch
                {
                    throw;
                }

                if (con != null)
                {
                    con.Close();
                }
            }
        }
        //impersonating another user samples
        public static void ImpersonateSamples()
        {
            //we will wrap the connection into a using statement to ensure it is disposed properly
            using (Connection K2Conn = new Connection())
            {
                //you must first establish a connection with the current credentials (or specific credentials) before you can impersonate
                K2Conn.Open("[servername]");
                //once you have connected to K2, you can impersonate another user, PROVIDED that the connected account
                //has the "Impersonate" permission on the K2 environment
                K2Conn.ImpersonateUser("[securityLabelName]:[username]"); //example: K2Conn.ImpersonateUser("K2:domain\username");
                //now that you have impersonated a user, you can perform actiosn on behalf of that user. here we will retrieve that user's worklist
                Worklist K2WL = K2Conn.OpenWorklist();
                //do something with the impersonated user's worklist

                //when you are done impersonating, you can revert to the original user account
                K2Conn.RevertUser();
            }
        }
Example #18
0
        public static void Approve(string sn, string action, NameValueCollection dataFields)
        {
            SourceCode.Workflow.Client.Connection con = new Connection();
            try
            {
                ConnectionSetup conSetup = GetConnectionSetup();
                con.Open(conSetup);
                con.ImpersonateUser(_CurrentUser);

                SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn);
                listItem.Release();
                if (dataFields != null)
                {
                    for (int i = 0; i < dataFields.Count; i++)
                    {
                        string key   = dataFields.GetKey(i).ToString();
                        string value = dataFields[key].ToString();
                        listItem.ProcessInstance.DataFields[key].Value = value;
                    }
                }
                listItem.Actions[action].Execute();
            }
            catch (Exception ex)
            {
                // TODO: throw?
                throw ex;
            }
            finally
            {
                try
                {
                    con.RevertUser();
                }
                catch
                { }

                if (con != null)
                {
                    con.Close();
                }
            }
        }
Example #19
0
    /// <summary>
    /// approve process instance
    /// </summary>
    /// <param name="sn">serial number</param>
    /// <param name="action">approval action</param>
    /// <returns>approve process instance successfully or not</returns>
    public static bool ApproveProcess(string sn, string action)
    {
        using (Connection conn = new Connection())
        {
            bool result = false;
            try
            {
                conn.Open(K2ServerName, GetConnString());

                conn.RevertUser();
                conn.ImpersonateUser(CurrentUser);

                WorklistItem wlItem = conn.OpenWorklistItem(sn);


                wlItem.Actions[action].Execute();
                result = true;
            }
            catch (Exception ex)
            {
                if (ex.Message.StartsWith("24411"))
                {
                    return(false);
                }
                else if (ex.Message.StartsWith("26030"))
                {
                    return(false);
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                conn.Close();
            }
            return(result);
        }
    }
Example #20
0
 /// <summary>
 /// get value of data field of current process
 /// </summary>
 /// <param name="sn">serial number</param>
 /// <param name="FieldName">name of the data field</param>
 /// <returns>value of the specified data field</returns>
 public static string GetDataField(string sn, string FieldName)
 {
     using (Connection conn = new Connection())
     {
         try
         {
             conn.Open(K2ServerName, GetConnString());
             conn.RevertUser();
             conn.ImpersonateUser(CurrentUser);
             WorklistItem wlItem = wlItem = conn.OpenWorklistItem(sn);
             return(wlItem.ProcessInstance.DataFields[FieldName].Value.ToString());
         }
         catch
         {
             throw;
         }
         finally
         {
             conn.Close();
         }
     }
 }
Example #21
0
 public static Worklist GetWorklistItem(string account)
 {
     using (Connection conn = new Connection())
     {
         Worklist wlt = null;
         try
         {
             conn.Open(K2ServerName, GetConnString());
             conn.RevertUser();
             conn.ImpersonateUser(account);
             wlt = conn.OpenWorklist();
         }
         catch
         {
             throw;
         }
         finally
         {
             conn.Close();
         }
         return(wlt);
     }
 }
Example #22
0
 /// <summary>
 /// 根据流水号  和 员工AD账号返回WorklistItem
 /// </summary>
 /// <param name="sn"></param>
 /// <returns></returns>
 public static WorklistItem GetWorklistItemWithSN(string sn, string Account)
 {
     using (Connection conn = new Connection())
     {
         WorklistItem retitem = null;
         try
         {
             conn.Open(K2ServerName, GetConnString());
             conn.RevertUser();
             conn.ImpersonateUser(Account);
             retitem = conn.OpenWorklistItem(sn);
         }
         catch
         {
             throw;
         }
         finally
         {
             conn.Close();
         }
         return(retitem);
     }
 }
Example #23
0
        public static void GetProcessInfo(string sn, ref string processId, ref string viewFlow)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    conn.Open(K2ServerName, GetConnString());
                    conn.RevertUser();
                    conn.ImpersonateUser(CurrentUser);
                    WorklistItem wlItem = conn.OpenWorklistItem(sn);

                    processId = wlItem.ProcessInstance.ID.ToString();
                    viewFlow  = wlItem.ProcessInstance.ViewFlow;
                }
                catch
                {
                    throw;
                }
                finally
                {
                    conn.Close();
                }
            }
        }
Example #24
0
        /// <summary>
        /// 挂起
        /// </summary>
        /// <param name="sn"></param>
        /// <param name="sourceUser"></param>
        /// <param name="second"></param>
        public static void SleepWorkListItem(string sn, string sourceUser, int second)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.ImpersonateUser(sourceUser);

                    SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn);
                    listItem.Sleep(true, second);
                }
                catch
                {
                    // TODO: throw?
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    {
                        throw;
                    }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #25
0
        public static void Redirect(string sn, string targetUser)
        {
            SourceCode.Workflow.Client.Connection con = new Connection();
            try
            {
                ConnectionSetup conSetup = GetConnectionSetup();
                con.Open(conSetup);
                con.ImpersonateUser(_CurrentUser);

                SourceCode.Workflow.Client.WorklistItem listItem = con.OpenWorklistItem(sn);
                listItem.Release();
                listItem.Redirect(targetUser);
                DBManager.AddWorkListLog(_CurrentUser, targetUser, listItem.SerialNumber, listItem.ProcessInstance.ID, listItem.ActivityInstanceDestination.ID, "Redirect", _CurrentUser);
            }
            catch (Exception ex)
            {
                // TODO: throw?
                throw ex;
            }
            finally
            {
                try
                {
                    con.RevertUser();
                }
                catch
                {
                    throw;
                }

                if (con != null)
                {
                    con.Close();
                }
            }
        }
Example #26
0
        /// <summary>
        /// 任务移交
        /// </summary>
        /// <param name="sn">任务SN</param>
        /// <param name="sourceUser">源用户</param>
        /// <param name="targetUser">目标用户</param>
        public static void RedirectWorkListItem(string sn, string sourceUser, string targetUser)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.ImpersonateUser(sourceUser);

                    SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn);
                    listItem.Redirect(targetUser);
                }
                catch (Exception ex)
                {
                    // TODO: throw?
                    throw ex;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    {
                        throw;
                    }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #27
0
    /// <summary>
    /// 转签
    /// </summary>
    /// <param name="sn"></param>
    /// <param name="Account"></param>
    /// <param name="nextUser"></param>
    public static void ForwardToNextApprover_Change(string sn, string Account, string nextUser)
    {
        using (Connection conn = new Connection())
        {
            try
            {
                conn.Open(K2ServerName, GetConnString());
                conn.RevertUser();
                conn.ImpersonateUser(Account);

                WorklistItem wli = conn.OpenWorklistItem(sn);
                wli.Actions["更新"].Execute();
                wli.Redirect(nextUser);
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
        }
    }
Example #28
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;
            }
        }
Example #29
0
        /// <summary>
        /// 委托代办
        /// </summary>
        /// <param name="sn"></param>
        /// <param name="sourceUser"></param>
        /// <param name="targetUser"></param>
        public static string DelegateWorkListItem(string sn, string sourceUser, string targetUser)
        {
            using (Connection conn = new Connection())
            {
                string result             = "";
                bool   ContainsTargetUser = false;
                try
                {
                    string          targetUserSL = SecurityLabelName + ":" + targetUser;
                    ConnectionSetup conSetup     = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.ImpersonateUser(sourceUser);

                    SourceCode.Workflow.Client.WorklistItem listItem = conn.OpenWorklistItem(sn);

                    //重置任务状态为Available,只有Available状态下的任务才有权限代理
                    listItem.Release();
                    //判断该任务是否已经代理给targetUser
                    foreach (Destination destuser in listItem.DelegatedUsers)
                    {
                        if (destuser.Name.Equals(targetUserSL, StringComparison.InvariantCultureIgnoreCase))
                        {
                            ContainsTargetUser = true;
                            result             = "任务不能重复代理给[" + targetUser + "]";
                            break;
                        }
                    }
                    if (!ContainsTargetUser)
                    {
                        //如果该任务是其它人代理给sourceUser的,则sourceUser不能再次代理给targetUser,即禁止传递代理
                        DataTable DelegationLog = K2DBHelper.GetDelegationsLog(listItem.SerialNumber).Tables[0];
                        foreach (DataRow dr in DelegationLog.Rows)
                        {
                            if (sourceUser.Equals(dr["ToUser"].ToString(), StringComparison.InvariantCultureIgnoreCase))
                            {
                                ContainsTargetUser = true;
                                result             = "该任务由[" + dr["FromUser"].ToString() + "]代理给[" + sourceUser + "]";
                                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:添加代理历史记录
                        int parentProcInstID = K2DBHelper.GetRootParentsID(listItem.ProcessInstance.ID);
                        K2DBHelper.AddDelegationsLog(listItem.ProcessInstance.ID, parentProcInstID, sn, sourceUser, targetUser, sourceUser);
                        result = "任务代理成功";
                    }
                    return(result);
                }
                catch
                {
                    // TODO: throw?
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    {
                        throw;
                    }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #30
0
        public ResultModel ReAssign(string sn, int assignFrom, int assignTo, out string activityName, out string processCode, out int procInstID)
        {
            Connection k2Connect = null;
            WorklistItem workList = null;
            ResultModel jr = new ResultModel() { Code = ResultCode.Fail };
            activityName = string.Empty;
            processCode = string.Empty;
            procInstID = 0;
            try
            {
                k2Connect = new Connection();
                k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]);
                k2Connect.ImpersonateUser(SecurityLable(assignFrom.ToString()));
                workList = k2Connect.OpenWorklistItem(sn);
                if (workList != null )
                {
                    workList.Redirect(SecurityLable(assignTo.ToString()));
                    jr.Code = ResultCode.Sucess;
                    jr.Msg = "";
                    activityName = workList.ActivityInstanceDestination.Name;
                    processCode = workList.ProcessInstance.DataFields["ProcessCode"].Value.ToString();
                    procInstID = workList.ProcessInstance.ID;

                }

            }
            catch (Exception ex)
            {
                jr.Msg = ex.Message;
            }
            finally
            {
                if (workList != null)
                {
                    if (workList.Status == WorklistStatus.Open)
                    {
                        try
                        {
                            k2Connect.RevertUser();
                            workList.Release();
                        }
                        catch { }
                    }
                }
                if (k2Connect != null)
                    k2Connect.Close();
            }
            return jr;
        }
Example #31
0
        public ResultModel StartProcess(string processName, int loginId, string objectId, string folio, Dictionary<string, string> dataFields,out int procInstId)
        {
            Connection k2Connect = null;
            WorklistItem workList = null;
            ResultModel jr = new ResultModel() { Code = ResultCode.Fail };
            procInstId = 0;
            try
            {
                k2Connect = new Connection();
                k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]);
                k2Connect.ImpersonateUser(SecurityLable(loginId.ToString()));
                //创建实例
                ProcessInstance ProcessInst = k2Connect.CreateProcessInstance(processName);
                if (!string.IsNullOrEmpty(folio))
                {
                    ProcessInst.Folio = folio;
                }
                #region //赋值datafields
                foreach (string key in dataFields.Keys)
                {
                    if (ProcessInst.DataFields[key] != null)
                    {
                        ProcessInst.DataFields[key].Value = dataFields[key];
                    }
                }
                #endregion

                k2Connect.StartProcessInstance(ProcessInst);

                procInstId = ProcessInst.ID;
                jr.Code = ResultCode.Sucess;
                jr.Msg = procInstId.ToString();
            }
            catch (Exception ex)
            {
                jr.Msg = ex.Message;
            }
            finally
            {
                if (workList != null)
                {
                    if (workList.Status == WorklistStatus.Open)
                    {
                        try
                        {
                            k2Connect.RevertUser();
                            workList.Release();
                        }
                        catch { }
                    }
                }
                if (k2Connect != null)
                    k2Connect.Close();
            }
            return jr;
            //var result = (new K2Service.K2Service()).StartProcess(processCode, loginId, objectId, folio, jsonData, ConfigurationManager.AppSettings["APIKEY"]);
        }
Example #32
0
        public ResultModel ApproveK2Process(string sn, int loginId, string actionString, string memo, Dictionary<string, string> dataFields, out string activityName, out string processCode, out int procInstID)
        {
            Connection k2Connect = null;
            WorklistItem workList = null;
            ResultModel jr = new ResultModel() { Code = ResultCode.Fail };
            activityName = string.Empty;
            processCode = string.Empty;
            procInstID = 0;
             try
            {
                k2Connect = new Connection();
                k2Connect.Open(ConfigurationManager.AppSettings["K2Server"], ConfigurationManager.AppSettings["K2LoginString"]);
                k2Connect.ImpersonateUser(SecurityLable(loginId.ToString()));

                workList = k2Connect.OpenWorklistItem(sn);
                if (workList != null)
                {
                    #region 更新Datafield
                    if (dataFields != null && dataFields.Count > 0)
                    {
                        ProcessInstance CurrentProcessInst = workList.ProcessInstance;
                        //更新Datafields
                        foreach (string key in dataFields.Keys)
                        {
                            if (CurrentProcessInst.DataFields[key] != null)
                            {
                                if (CurrentProcessInst.DataFields[key].Value.ToString() != dataFields[key])
                                {
                                    CurrentProcessInst.DataFields[key].Value = dataFields[key];
                                }
                            }
                        }
                    }
                    #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 isExcute = false;
                            for (int i = 0; i < workList.Actions.Count; i++)
                            {
                                if (workList.Actions[i].Name == actionString)
                                {
                                    workList.Actions[i].Execute();
                                    isExcute = true;
                                    break;
                                }
                            }
                            if (!isExcute)
                            {
                                jr.Code = ResultCode.Fail;
                                jr.Msg = string.Format("Action:{0}错误", actionString);
                                return jr;
                            }
                        }
                    }
                    #endregion

                    jr.Code = ResultCode.Sucess;
                    jr.Msg = "";
                    activityName = workList.ActivityInstanceDestination.Name;
                    processCode = workList.ProcessInstance.DataFields["ProcessCode"].Value.ToString();
                    procInstID = workList.ProcessInstance.ID;
                }
            }
             catch (Exception ex)
             {
                 jr.Msg = ex.Message;
             }
             finally
             {
                 if (workList != null)
                 {
                     if (workList.Status == WorklistStatus.Open)
                     {
                         try
                         {
                             k2Connect.RevertUser();
                             workList.Release();
                         }
                         catch { }
                     }
                 }
                 if (k2Connect != null)
                     k2Connect.Close();
             }

             return jr;
        }
        public ContinuationAction MessageReceived(ListenerContext e)
        {
            // You can inherit from MessageExtendedInformation if you wish,
            // the likely scenario for this is if you support plugins yourself.
            var extended      = e.ReceivedInformation.Message.GetExtendedInformation <MessageExtendedInformation>();
            var replyExtended = extended.Invert(null);

            string workflowName;

            if (extended.Message.Title.StartsWith("START: ", StringComparison.OrdinalIgnoreCase))
            {
                workflowName = extended.Message.Title.Substring(7).Trim();
            }
            else
            {
                return(ContinuationAction.Continue); // Allow other plugins to execute.
            }

            // Get the message body.
            string body;

            try
            {
                using (var bodyStream = e.ReceivedInformation.Message.OpenView(new ContentType("text/plain")))
                {
                    if (bodyStream != null)
                    {
                        // Another plugin may have moved the position within the stream.
                        bodyStream.Seek(0, System.IO.SeekOrigin.Begin);
                        using (var sr = new StreamReader(bodyStream))
                        {
                            body = sr.ReadToEnd().Trim();
                        }
                    }
                    else
                    {
                        body = string.Empty;
                    }
                }
            }
            catch
            {
                // TODO: Logging etc.
                return(ContinuationAction.Continue); // Allow other plugins to execute.
            }

            // TODO: Get data from the body somehow.
            // You can also look into attachments for e.g. InfoPath forms:
            // e.ReceivedInformation.Message.Attachments

            try
            {
                var con = new Connection();
                var cs  = new ConnectionSetup();
                cs.ParseConnectionString(_k2ServerConnectionString);

                try
                {
                    Exception lastException = null;
                    con.Open(cs);

                    // AlternateIdentities are identities with the same email
                    // address, most likely due badly configured claims.
                    for (var i = 0; i < e.AlternateIdentities.Length; i++)
                    {
                        var    alt = e.AlternateIdentities[i];
                        string fqn;

                        // Search for a FQN in the identity.
                        if (alt.TryGetValue("Fqn", out fqn))
                        {
                            try
                            {
                                con.RevertUser();
                                con.ImpersonateUser(fqn);

                                var pi = con.CreateProcessInstance(workflowName);
                                // TODO: Set data in the workflow.
                                con.StartProcessInstance(pi);

                                // Tell the user the workflow was started.
                                _destination.ReplyTo(e.ReceivedInformation.Message, new MessageBodyReader("text/plain", "Workflow started"), replyExtended);

                                e.ReceivedInformation.Commit();  // Indicate we were able to handle the message.
                                return(ContinuationAction.Halt); // Stop other plugins from executing.
                            }
                            catch (Exception ex)
                            {
                                // TODO: Logging etc.
                                // This isn't nessecarily a complete failure,
                                // one of the other alternate identities may be
                                // able to action this.
                                lastException = ex;
                            }
                        }
                    }

                    string message;
                    if (lastException != null)
                    {
                        // Identities exist, but the user likely doesn't have rights.
                        message = lastException.ToString();
                    }
                    else
                    {
                        // No identities exist.
                        message = "Could not find a K2 user for your email address.";
                    }

                    message = "The workflow could not be started: " + message;

                    // Respond with the error.
                    _destination.ReplyTo(e.ReceivedInformation.Message, new MessageBodyReader("text/plain", message), replyExtended);

                    e.ReceivedInformation.Commit();  // Indicate we were able to handle the message.
                    return(ContinuationAction.Halt); // Stop other plugins from executing.
                }
                finally
                {
                    if (con != null)
                    {
                        con.Close();
                        con.Dispose();
                    }
                }
            }
            catch
            {
                // TODO: Logging etc.
                return(ContinuationAction.Continue); // Allow other plugins to execute.
            }
        }
        public DataTable GetWorklistItems(Dictionary<string, object> properties, Dictionary<string, object> parameters)
        {
            bool impersonate = false;
            string impersonateUser = "";
            ConnectionSetup connectSetup = new ConnectionSetup();
            connectSetup.ConnectionString = _connectionString;

            if (properties.ContainsKey("UserName"))
            {
                if (!(string.IsNullOrEmpty(properties["UserName"].ToString())))
                {
                    connectSetup.ConnectionString = _connectionstringImpersonate;
                    impersonateUser = properties["UserName"].ToString();
                    impersonate = true;
                }
                else
                    connectSetup.ConnectionString = _connectionString;
            }

            WorklistCriteria criteria = null;
            if (properties.Count > 0)
                criteria = GetWorklistCriteria(properties);

            Connection cnn = new Connection();
            try
            {
                cnn.Open(connectSetup);
                if (impersonate)
                    cnn.ImpersonateUser(impersonateUser);

                DataTable dt = GetResultTable();

                Worklist worklist;
                if ((criteria != null) && (criteria.Filters.GetLength(0) > 0))
                    worklist = cnn.OpenWorklist(criteria);
                else
                    worklist = cnn.OpenWorklist();
                foreach (WorklistItem item in worklist)
                {
                    DataRow row = dt.NewRow();
                    row["AllocatedUser"] = item.AllocatedUser;
                    row["Data"] = item.Data;
                    row["ID"] = item.ID;
                    row["Link"] = "<hyperlink><link>" + HttpUtility.HtmlEncode(item.Data) + "</link><display>Open</display></hyperlink>";
                    row["SerialNumber"] = item.SerialNumber;
                    row["Status"] = item.Status;
                    row["ActivityID"] = item.ActivityInstanceDestination.ActID;
                    row["ActivityInstanceID"] = item.ActivityInstanceDestination.ActInstID;
                    row["ActivityName"] = item.ActivityInstanceDestination.Name;
                    row["Priority"] = item.ActivityInstanceDestination.Priority;
                    row["StartDate"] = item.EventInstance.StartDate;
                    row["ActivityInstanceDestinationID"] = item.ActivityInstanceDestination.ID;
                    row["ProcessInstanceID"] = item.ProcessInstance.ID;
                    row["ProcessFullName"] = item.ProcessInstance.FullName;
                    row["ProcessName"] = item.ProcessInstance.Name;
                    row["Folio"] = item.ProcessInstance.Folio;
                    row["EventInstanceName"] = item.EventInstance.Name;
                    dt.Rows.Add(row);
                }
                if (impersonate)
                    cnn.RevertUser();
                cnn.Close();
                cnn.Dispose();
                return dt;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }