Example #1
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 #2
0
        public void WhoAmI()
        {
            if (GetBoolProperty(Constants.SOProperties.Identity.UserWindowsImpersonation))
            {
                System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero);
            }

            string k2imp = GetStringProperty(Constants.SOProperties.Identity.K2ImpersonateUser, false);

            ServiceObject serviceObject = ServiceBroker.Service.ServiceObjects[0];

            serviceObject.Properties.InitResultTable();
            DataTable results = ServiceBroker.ServicePackage.ResultTable;

            using (Connection k2Con = new Connection())
            {
                k2Con.Open(K2ClientConnectionSetup);
                if (!string.IsNullOrEmpty(k2imp))
                {
                    k2Con.ImpersonateUser(k2imp);
                }

                DataRow dr = results.NewRow();
                dr[Constants.SOProperties.Identity.FQN] = k2Con.User.FQN;
                dr[Constants.SOProperties.Identity.IdentityDescription] = k2Con.User.Description;
                dr[Constants.SOProperties.Identity.IdentityDisplayName] = k2Con.User.DisplayName;
                dr[Constants.SOProperties.Identity.UserEmail]           = k2Con.User.Email;
                dr[Constants.SOProperties.Identity.UserManager]         = k2Con.User.Manager;
                dr[Constants.SOProperties.Identity.UserName]            = k2Con.User.Name;
                dr[Constants.SOProperties.Identity.UserUserLabel]       = k2Con.User.UserLabel;
                dr[Constants.SOProperties.Identity.CallingFQN]          = CallingFQN;
                results.Rows.Add(dr);
                k2Con.Close();
            }
        }
Example #3
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 #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>
 ///
 /// </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 #6
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 #7
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 #8
0
        /// <summary>
        /// Get Workflow Client with impersonate user
        /// </summary>
        /// <returns>The worklist connection to K2 Workflow server</returns>
        public Connection GetWorkflowClient()
        {
            ConnectionStringSettings setting = ConfigurationManager.ConnectionStrings["WorkflowServer"];

            if (_userAccount == null)
            {
                return(null);
            }

            if (setting == null)
            {
                return(null);
            }

            if (string.IsNullOrEmpty(setting.ConnectionString))
            {
                return(null);
            }

            ConnectionSetup connectionSetup = new ConnectionSetup();

            connectionSetup.ParseConnectionString(setting.ConnectionString);
            Connection connection = new Connection();

            connection.Open(connectionSetup);
            if (connection.User == null || string.Compare(connection.User.Name, _userAccount, StringComparison.OrdinalIgnoreCase) != 0)
            {
                connection.ImpersonateUser(_userAccount);
            }
            return(connection);
        }
Example #9
0
        /// <summary>
        /// 获取流程变量
        /// </summary>
        /// <param name="sn">流程SN</param>
        /// <param name="FieldNames">要获取的变量的List</param>
        /// <returns>变量的List</returns>
        public static void GetProcessDataFields(string sn, string currentUser, CDataFields dataFields)
        {
            using (Connection conn = new Connection())
            {
                try
                {
                    ConnectionSetup conSetup = GetConnectionSetup();
                    conn.Open(conSetup);
                    conn.ImpersonateUser(currentUser);
                    WorklistItem listItem = conn.OpenWorklistItem(sn);
                    GetDataFields(listItem, dataFields);
                }
                catch
                {
                    throw;
                }
                finally
                {
                    try
                    {
                        conn.RevertUser();
                    }
                    catch
                    { }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }
Example #10
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 #11
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 #12
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 #13
0
 /// <summary>
 /// 模拟用户
 /// </summary>
 /// <param name="connection"></param>
 /// <param name="user"></param>
 public static void ImpersonateUser(Connection connection, string user)
 {
     if (user.IndexOf(CENLINE) < 0)
     {
         user = CENLINE + user;
     }
     connection.ImpersonateUser(user);//模拟审批者
 }
Example #14
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 #15
0
        public WorkflowItem GetWorkflowItemBySN(string serialNumber, String impersonateUser)
        {
            // if the serial number is null or empty we do not want to do any of this
            if (!string.IsNullOrEmpty(serialNumber))
            {
                using (var k2Connection = new Connection())
                {
                    ConnectionSetup k2Setup = new ConnectionSetup();
                    k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                    k2Connection.Open(k2Setup);

                    if (!String.IsNullOrEmpty(impersonateUser))
                    {
                        k2Connection.ImpersonateUser(impersonateUser);
                    }

                    var workCriteria = new WorklistCriteria {
                        NoData = false, Platform = "ASP"
                    };

                    if (!string.IsNullOrEmpty(serialNumber))
                    {
                        workCriteria.AddFilterField(WCField.SerialNumber, WCCompare.Equal, serialNumber);
                    }

                    Worklist k2Worklist = k2Connection.OpenWorklist(workCriteria);

                    WorkflowItem retItem = null;

                    foreach (WorklistItem item in k2Worklist)
                    {
                        retItem = new WorkflowItem(item);
                    }

                    // now that we have the workflow item get the count of the related documents
                    if ((retItem != null) && (!string.IsNullOrEmpty(retItem.PolicyID)))
                    {
                        using (DocumentService.DocumentServiceClient client = new DocumentService.DocumentServiceClient())
                        {
                            retItem.RelatedDocumentCount = client.GetDocumentsCountForPolicy(retItem.PolicyID);
                        }
                    }

                    return(retItem);
                }
            }
            return(null);
        }
Example #16
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 #17
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 #18
0
        public K2Client(string identity)
        {
            this.ManagedUser = identity.FQNWithK2Label();

            if (_connection == null)
            {
                var setup   = new ConnectionSetup();
                var setting = ConfigurationManager.ConnectionStrings["WorkflowServer"];
                setup.ParseConnectionString(setting.ConnectionString);
                _connection = new Connection();
                _connection.Open(setup);
                if (_connection.User == null || string.Compare(_connection.User.Name, ManagedUser, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    _connection.ImpersonateUser(ManagedUser);
                }
            }
        }
Example #19
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();
                }
            }
        }
Example #20
0
        public Worklist GetWorklistItems(String searchTerm, Int32 skip, Int32 take, Dictionary <WCField, WCSortOrder> sorts, String impersonateUser)
        {
            using (var k2Connection = new Connection())
            {
                ConnectionSetup k2Setup = new ConnectionSetup();
                k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                k2Connection.Open(k2Setup);

                if (!String.IsNullOrEmpty(impersonateUser))
                {
                    k2Connection.ImpersonateUser("K2:" + impersonateUser);
                }

                var workCriteria = new WorklistCriteria {
                    NoData = true, Platform = "ASP"
                };

                if (!string.IsNullOrEmpty(searchTerm))
                {
                    String searchTermFormat = String.Format("%{0}%", searchTerm);
                    workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null);           //  (
                    workCriteria.AddFilterField(WCField.ActivityName, WCCompare.Like, searchTermFormat);                //  ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.EventName, WCCompare.Like, searchTermFormat);     //  OR ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.ProcessFolio, WCCompare.Like, searchTermFormat);  //  OR ...
                    workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);             //  )
                }

                //  No AND required - seems like bug - this bit gets put in a different bit of the query K2 creates.
                //  Hide allocated items like the SharePoint K2 worlist does by default.
                workCriteria.AddFilterField(WCField.WorklistItemStatus, WCCompare.NotEqual, WorklistStatus.Allocated);

                workCriteria.StartIndex = skip;
                workCriteria.Count      = take;

                foreach (KeyValuePair <WCField, WCSortOrder> sort in sorts)
                {
                    workCriteria.AddSortField(sort.Key, sort.Value);
                }

                Worklist k2Worklist = k2Connection.OpenWorklist(workCriteria);

                return(k2Worklist);
            }
        }
        //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();
            }
        }
        internal DataTable GetWorklistItems(Dictionary <string, object> properties, Dictionary <string, object> parameters)
        {
            try
            {
                DataTable        dt       = GetResultTable();
                WorklistCriteria criteria = GetWorklistCriteria(properties);

                ConnectionSetup cnnSetup = new ConnectionSetup();
                cnnSetup.ConnectionString = this._execSettings.ConnectionString;

                using (Connection cnn = new Connection())
                {
                    cnn.Open(cnnSetup);

                    if (this._execSettings.UseImpersonation)
                    {
                        cnn.ImpersonateUser(this._execSettings.ImpersonateUser);
                    }

                    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();
                        PopulateDataRow(item, row);
                        dt.Rows.Add(row);
                    }
                    cnn.Close();
                }
                return(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public Worklist GetWorklistItems(String searchTerm, Int32 skip, Int32 take, Dictionary<WCField, WCSortOrder> sorts, String impersonateUser)
        {
            using (var k2Connection = new Connection())
            {
                ConnectionSetup k2Setup = new ConnectionSetup();
                k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                k2Connection.Open(k2Setup);

                if (!String.IsNullOrEmpty(impersonateUser))
                    k2Connection.ImpersonateUser("K2:" + impersonateUser);

                var workCriteria = new WorklistCriteria { NoData = true, Platform = "ASP" };                                                
                                
                if (!string.IsNullOrEmpty(searchTerm))
                {
                    String searchTermFormat = String.Format("%{0}%", searchTerm);
                    //String searchTermFormat = String.Format("% / % / % / % / %{0}%", searchTerm);
                    workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null);           //  (
                    workCriteria.AddFilterField(WCField.ActivityName, WCCompare.Like, searchTermFormat);                //  ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.EventName, WCCompare.Like, searchTermFormat);     //  OR ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.ProcessFolio, WCCompare.Like, searchTermFormat);  //  OR ...
                    workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);             //  )
                    //workCriteria.AddFilterField(WCField.ProcessFolio, WCCompare.Like, searchTermFormat);
                }

                //  No AND required - seems like bug - this bit gets put in a different bit of the query K2 creates.
                //  Hide allocated items like the SharePoint K2 worlist does by default.
                workCriteria.AddFilterField(WCField.WorklistItemStatus, WCCompare.NotEqual, WorklistStatus.Allocated);                 

                workCriteria.StartIndex = skip;
                workCriteria.Count = take;                
                
                foreach (KeyValuePair<WCField,WCSortOrder> sort in sorts)
                {
                    workCriteria.AddSortField(sort.Key, sort.Value);                                        
                }

                Worklist k2Worklist = k2Connection.OpenWorklist(workCriteria);      

                return k2Worklist;
            }
        }
Example #24
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 #25
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();
                }
            }
        }
        internal DataTable LoadWorklistItem(string serialNumber)
        {
            if (string.IsNullOrEmpty(serialNumber))
            {
                throw new ArgumentException("Value must not be null or empty.", "serialNumer");
            }

            try
            {
                DataTable dt  = GetResultTable();
                DataRow   row = dt.NewRow();

                ConnectionSetup cnnSetup = new ConnectionSetup();
                cnnSetup.ConnectionString = this._execSettings.ConnectionString;

                using (Connection cnn = new Connection())
                {
                    cnn.Open(cnnSetup);

                    if (this._execSettings.UseImpersonation)
                    {
                        cnn.ImpersonateUser(this._execSettings.ImpersonateUser);
                    }

                    WorklistItem item = cnn.OpenWorklistItem(serialNumber);

                    if (item != null)
                    {
                        PopulateDataRow(item, row);
                        dt.Rows.Add(row);
                    }

                    cnn.Close();
                }
                return(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Example #27
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 #28
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 #29
0
        public WorklistItem GetWorklistItemBySN(string serialNumber, String impersonateUser)
        {
            // if the serial number is null or empty we do not want to do any of this
            if (!string.IsNullOrEmpty(serialNumber))
            {
                using (var k2Connection = new Connection())
                {
                    ConnectionSetup k2Setup = new ConnectionSetup();
                    k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                    k2Connection.Open(k2Setup);

                    if (!String.IsNullOrEmpty(impersonateUser))
                    {
                        k2Connection.ImpersonateUser(impersonateUser);
                    }

                    return(k2Connection.OpenWorklistItem(serialNumber));
                }
            }
            return(null);
        }
Example #30
0
        /// <summary>
        /// 调用k2的dll,生成流程
        /// <param name="dataFields">开启流程所需数据</param>
        /// <param name="processName">流程名称</param>
        /// </summary>
        public static int StartProcess(string processName, Dictionary <string, string> dataFields, string objectId, string folio, string userName)
        {
            int        processInstId = 0;
            Connection k2Connection  = new Connection();

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

                //创建实例
                ProcessInstance processInst = k2Connection.CreateProcessInstance(processName);
                processInstId = processInst.ID;

                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
            }
            finally
            {
                if (k2Connection != null)
                {
                    k2Connection.Close();
                }
            }

            return(processInstId);
        }
Example #31
0
        /// <summary>
        /// 调用k2的dll,生成流程
        /// <param name="dataFields">开启流程所需数据</param>
        /// <param name="processName">流程名称</param>
        /// </summary>
        public static int StartProcess(string processName, Dictionary<string, string> dataFields, string objectId, string folio, string userName)
        {
            int processInstId = 0;
            Connection k2Connection = new Connection();

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

                //创建实例
                ProcessInstance processInst = k2Connection.CreateProcessInstance(processName);
                processInstId = processInst.ID;

                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
            }
            finally
            {
                if (k2Connection != null)
                {
                    k2Connection.Close();
                }
            }

            return processInstId;
        }
Example #32
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);
     }
 }
        public WorklistItem GetWorklistItemBySN(string serialNumber, String impersonateUser)
        {
            using (var k2Connection = new Connection())
            {
                ConnectionSetup k2Setup = new ConnectionSetup();
                k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                k2Connection.Open(k2Setup);

                if (!String.IsNullOrEmpty(impersonateUser))
                    k2Connection.ImpersonateUser(impersonateUser);

                return k2Connection.OpenWorklistItem(serialNumber);
            }           
        }
        internal DataTable LoadWorklistItem(string serialNumber)
        {
            if (string.IsNullOrEmpty(serialNumber))
                throw new ArgumentException("Value must not be null or empty.", "serialNumer");

            try
            {
                DataTable dt = GetResultTable();
                DataRow row = dt.NewRow();

                ConnectionSetup cnnSetup = new ConnectionSetup();
                cnnSetup.ConnectionString = this._execSettings.ConnectionString;

                using (Connection cnn = new Connection())
                {
                    cnn.Open(cnnSetup);

                    if (this._execSettings.UseImpersonation)
                        cnn.ImpersonateUser(this._execSettings.ImpersonateUser);

                    WorklistItem item = cnn.OpenWorklistItem(serialNumber);

                    if (item != null)
                    {
                        PopulateDataRow(item, row);
                        dt.Rows.Add(row);
                    }

                    cnn.Close();
                }
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        internal DataTable GetWorklistItems(Dictionary<string, object> properties, Dictionary<string, object> parameters)
        {
            try
            {
                DataTable dt = GetResultTable();
                WorklistCriteria criteria = GetWorklistCriteria(properties);

                ConnectionSetup cnnSetup = new ConnectionSetup();
                cnnSetup.ConnectionString = this._execSettings.ConnectionString;

                using (Connection cnn = new Connection())
                {
                    cnn.Open(cnnSetup);

                    if (this._execSettings.UseImpersonation)
                        cnn.ImpersonateUser(this._execSettings.ImpersonateUser);

                    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();
                        PopulateDataRow(item, row);
                        dt.Rows.Add(row);
                    }
                    cnn.Close();
                }
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public WorklistItem GetWorklistItemBySN(string serialNumber, String impersonateUser)
        {
            // if the serial number is null or empty we do not want to do any of this
            if (!string.IsNullOrEmpty(serialNumber))
            {
                using (var k2Connection = new Connection())
                {
                    ConnectionSetup k2Setup = new ConnectionSetup();
                    k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                    k2Connection.Open(k2Setup);

                    if (!String.IsNullOrEmpty(impersonateUser))
                        k2Connection.ImpersonateUser(impersonateUser);

                    return k2Connection.OpenWorklistItem(serialNumber);
                }
            }
            return null;
        }
        protected override void Execute(CodeActivityContext executionContext)
        {
            SourceCode.Workflow.Client.Connection conn = null;
            SourceCode.Workflow.Client.ProcessInstance procInst = null;
            XmlDocument EntityDoc = null;
            string K2EntityIdDataField = string.Empty;
            string K2EntityNameDataField = string.Empty;
            string K2ContextXMLDataField = string.Empty;


            //Create the tracing service
            ITracingService tracingService = executionContext.GetExtension<ITracingService>();

            //Create the context
            IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                        
            // get K2 configuration context
            // custom entity that stores core information for each entity and process

            EntityID = context.PrimaryEntityId;
            CRMEntityName = context.PrimaryEntityName.ToLower();
            

            //Get Processes to Start from the K2 Assosiation entity in CRM
            // Workflow Activity gets these values from the WF configuration
            // Plugin retrieves these values from the K2 Associations entity instance

            K2ProcessName = ProcessFullName.Get<string>(executionContext);
            K2EntityIdDataField = EntityIdDataField.Get<string>(executionContext);
            K2EntityNameDataField = EntityNameDataField.Get<string>(executionContext);
            K2ContextXMLDataField = ContextXMLDataField.Get<string>(executionContext);

            // Get K2 Settings
            #region K2 Settings
            //Get Connection Settings

            // all users need read access to the K2 Settings and K2 Associations Entity
            // need to find a way to give all users access by default
            // TODO: revert to system user to read K2settings

            EntityCollection k2settings = service.RetrieveMultiple(new FetchExpression(Resources.K2SettingsFetchXML));

            foreach (Entity setting in k2settings.Entities)
            {
                string name = setting["k2_name"].ToString();
                string value = setting["k2_value"].ToString();

                switch (name)
                {
                    case "WorkflowServerConnectionString":
                        K2WorkflowServerConnectionString = value;
                        break;
                    case "HostServerConnectionString":
                        K2HostServerConnectionString = value;
                        break;
                    case "K2ServerName":
                        K2Server = value;
                        break;
                }
            }
            #endregion K2 Settings

            #region Create XML Context
            
            ColumnSet allColumns = new ColumnSet(true);
            
            Entity currentEntity = service.Retrieve(CRMEntityName, EntityID, allColumns);

            Entity originatorUserEntity = service.Retrieve("systemuser", context.UserId, allColumns);

            XmlDocument inputDataDoc = new XmlDocument();
            
            //Create instantiation data for Entity
            EntityDoc = new XmlDocument();
            XmlElement EntElement = EntityDoc.CreateElement("CRMContext");

            //Create Item element
            XmlElement xmlItem = EntityDoc.CreateElement("Context");

            //Create Name Element
            XmlElement xmlName = EntityDoc.CreateElement("EntityId");
            xmlName.InnerText = EntityID.ToString();
            xmlItem.AppendChild(xmlName);

            xmlName = EntityDoc.CreateElement("EntityType");
            xmlName.InnerText = context.PrimaryEntityName;
            xmlItem.AppendChild(xmlName);

            XmlElement xmlOrgName = EntityDoc.CreateElement("Organization");
            xmlOrgName.InnerText = context.OrganizationName;
            xmlItem.AppendChild(xmlOrgName);

            xmlName = EntityDoc.CreateElement("CRMUserId");
            xmlName.InnerText = context.UserId.ToString();
            xmlItem.AppendChild(xmlName);

            xmlName = EntityDoc.CreateElement("UserFQN");
            xmlName.InnerText = originatorUserEntity["domainname"] != null ? originatorUserEntity["domainname"].ToString() : "";
            xmlItem.AppendChild(xmlName);

            xmlName = EntityDoc.CreateElement("UserDisplayName");
            xmlName.InnerText = originatorUserEntity["fullname"] != null ? originatorUserEntity["fullname"].ToString() : "";
            xmlItem.AppendChild(xmlName);

            //Add Item to main doc
            EntElement.AppendChild(xmlItem);

            EntityDoc.AppendChild(EntElement);

            //Release node objects
            EntElement = null;
            xmlName = null;

            #endregion Create XML Context

            conn = new Connection();
            //procInst = new ProcessInstance();

            try
            {
                ConnectionSetup connectSetup = new ConnectionSetup();
                connectSetup.ConnectionString = K2WorkflowServerConnectionString;

                conn.Open(connectSetup);

                if (originatorUserEntity != null && originatorUserEntity["domainname"] != null)
                { 
                    conn.ImpersonateUser(originatorUserEntity["domainname"].ToString());
                }

                //Create new process instance
                procInst = conn.CreateProcessInstance(K2ProcessName);

                //Set CRM context field value
                if (!string.IsNullOrEmpty(K2ContextXMLDataField))
                {
                    try
                    {
                        procInst.XmlFields[K2ContextXMLDataField].Value = EntityDoc.OuterXml.ToString();
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.EventLog.WriteEntry("SourceCode.Logging.Extension.EventLogExtension", "K2 CRM Plugin - Entity Name - " + context.PrimaryEntityName.ToString() + " - " + "Error writing to XMLField " + K2ContextXMLDataField + " :::: " + ex.Message, System.Diagnostics.EventLogEntryType.Error);
                    }
                }
                if (!string.IsNullOrEmpty(K2EntityIdDataField))
                {
                    try
                    {
                        procInst.DataFields[K2EntityIdDataField].Value = context.PrimaryEntityId;
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.EventLog.WriteEntry("SourceCode.Logging.Extension.EventLogExtension", "K2 CRM Plugin - Entity Name - " + context.PrimaryEntityName.ToString() + " - " + "Error writing to DataField " + K2EntityIdDataField + " :::: " + ex.Message, System.Diagnostics.EventLogEntryType.Error);
                    }

                }
                if (!string.IsNullOrEmpty(K2EntityNameDataField))
                {
                    try
                    {
                        procInst.DataFields[K2EntityNameDataField].Value = context.PrimaryEntityName.ToLower();
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.EventLog.WriteEntry("SourceCode.Logging.Extension.EventLogExtension", "K2 CRM Plugin - Entity Name - " + context.PrimaryEntityName.ToString() + " - " + "Error writing to DataField " + K2EntityNameDataField + " :::: " + ex.Message, System.Diagnostics.EventLogEntryType.Error);
                    }
                }
                // start the K2 process
                conn.StartProcessInstance(procInst);

                try
                {
                    System.Diagnostics.EventLog.WriteEntry("SourceCode.Logging.Extension.EventLogExtension", "Process Started: " + K2ProcessName, System.Diagnostics.EventLogEntryType.Information);
                }
                catch { }

            }
            catch (Exception ex)
            {
                System.Diagnostics.EventLog.WriteEntry("SourceCode.Logging.Extension.EventLogExtension", "Entity Name - " + context.PrimaryEntityName.ToString() + " - " + ex.Message, System.Diagnostics.EventLogEntryType.Error);
                throw;
            }
            finally
            {
                if (service != null)
                    service = null;

                if (conn != null)
                    conn.Dispose();
                    conn = null;

                if (procInst != null)
                    procInst = null;
                EntityDoc = null;
            }
        }
        public void WhoAmI()
        {
            if (GetBoolProperty(Constants.SOProperties.Identity.UserWindowsImpersonation))
            {
                System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero);
            }

            string k2imp = GetStringProperty(Constants.SOProperties.Identity.K2ImpersonateUser, false);

            ServiceObject serviceObject = ServiceBroker.Service.ServiceObjects[0];
            serviceObject.Properties.InitResultTable();
            DataTable results = ServiceBroker.ServicePackage.ResultTable;

            using (Connection k2Con = new Connection())
            {
                k2Con.Open(K2ClientConnectionSetup);
                if (!string.IsNullOrEmpty(k2imp))
                {
                    k2Con.ImpersonateUser(k2imp);
                }

                DataRow dr = results.NewRow();
                dr[Constants.SOProperties.Identity.FQN] = k2Con.User.FQN;
                dr[Constants.SOProperties.Identity.IdentityDescription] = k2Con.User.Description;
                dr[Constants.SOProperties.Identity.IdentityDisplayName] = k2Con.User.DisplayName;
                dr[Constants.SOProperties.Identity.UserEmail] = k2Con.User.Email;
                dr[Constants.SOProperties.Identity.UserManager] = k2Con.User.Manager;
                dr[Constants.SOProperties.Identity.UserName] = k2Con.User.Name;
                dr[Constants.SOProperties.Identity.UserUserLabel] = k2Con.User.UserLabel;
                dr[Constants.SOProperties.Identity.CallingFQN] = CallingFQN;
                results.Rows.Add(dr);
                k2Con.Close();
            }
        }
        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;
            }
        }
Example #40
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 #41
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 #42
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 WorkflowItem GetWorkflowItemBySN(string serialNumber, String impersonateUser)
        {
            using (var k2Connection = new Connection())
            {
                ConnectionSetup k2Setup = new ConnectionSetup();
                k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                k2Connection.Open(k2Setup);

                if (!String.IsNullOrEmpty(impersonateUser))
                    k2Connection.ImpersonateUser(impersonateUser);

                var workCriteria = new WorklistCriteria { NoData = true, Platform = "ASP" };

                if (!string.IsNullOrEmpty(serialNumber))
                {
                    workCriteria.AddFilterField(WCField.SerialNumber, WCCompare.Equal, serialNumber);        
                }
                
                Worklist k2Worklist = k2Connection.OpenWorklist(workCriteria);

                WorkflowItem retItem = null;

                foreach (WorklistItem item in k2Worklist)
                {
                    retItem = new WorkflowItem(item);
                }

                // now that we have the workflow item get the count of the related documents
                if ((retItem!=null)&&(!string.IsNullOrEmpty(retItem.PolicyID)))
                {
                    using (DocumentService.DocumentServiceClient client = new DocumentService.DocumentServiceClient())
                    {
                        retItem.RelatedDocumentCount = client.GetDocumentsCountForPolicy(retItem.PolicyID);
                    }
                }

                return retItem;

            }
        }
        public List<WorkflowItem> GetWorkflowItems(String searchTerm, Int32 skip, Int32 take, Dictionary<WCField, WCSortOrder> sorts, String impersonateUser, out Int32 count, out Int32 totalCount, List<Tuple<String, String, String>> extraFilters)
        {
            Tuple<String, String, String> cobEF = null;
            Tuple<String, String, String> yearEF = null;
            Tuple<String, String, String> descEF = null;
            Tuple<String, String, String> insdEF = null;
            Tuple<String, String, String> bkrEF = null;
            Tuple<String, String, String> uwrEF = null;
            Tuple<String, String, String> actEF = null;             

            if (extraFilters != null)
            {
                cobEF = extraFilters.FirstOrDefault(f => f.Item1 == "COBId");
                yearEF = extraFilters.FirstOrDefault(f => f.Item1 == "AccountYear");
                descEF = extraFilters.FirstOrDefault(f => f.Item1 == "Description");
                insdEF = extraFilters.FirstOrDefault(f => f.Item1 == "InsuredName");
                bkrEF = extraFilters.FirstOrDefault(f => f.Item1 == "BrokerPseudonym");
                uwrEF = extraFilters.FirstOrDefault(f => f.Item1 == "UnderwriterCode");
                actEF = extraFilters.FirstOrDefault(f => f.Item1 == "Activity");
            }
            String cobExtraFilter = cobEF == null ? String.Empty : cobEF.Item3;
            Int32 yearParse;
            Int32? yearExtraFilter = null;
            if (Int32.TryParse(yearEF == null ? String.Empty : yearEF.Item3, out yearParse))
                yearExtraFilter = yearParse;

            String descExtraFilter = descEF == null ? String.Empty : descEF.Item3;
            String insdExtraFilter = insdEF == null ? String.Empty : insdEF.Item3;
            String bkrExtraFilter = bkrEF == null ? String.Empty : bkrEF.Item3;
            String uwrExtraFilter = uwrEF == null ? String.Empty : uwrEF.Item3;
            String actExtraFilter = actEF == null ? String.Empty : actEF.Item3;

            List<WorkflowItem> retArray = new List<WorkflowItem>();
            using (var k2Connection = new Connection())
            {
                ConnectionSetup k2Setup = new ConnectionSetup();
                k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                k2Connection.Open(k2Setup);

                if (!String.IsNullOrEmpty(impersonateUser))
                    k2Connection.ImpersonateUser(impersonateUser);

                var workCriteria = new WorklistCriteria { NoData = true, Platform = "ASP" };
                
                //String propertyFilter = String.Format("% / {0} / {1} / % / %{2}%", uwrExtraFilter, searchTerm);
                String propertyFilter = String.Format("% / {0} / {1}%{2} / % / {3}",
                    String.IsNullOrEmpty(uwrExtraFilter) ? "%" : uwrExtraFilter,
                    cobExtraFilter,
                    yearExtraFilter == null ? String.Empty : yearExtraFilter.ToString().Substring(2),
                    String.IsNullOrEmpty(insdExtraFilter) ? "%" : "%" + insdExtraFilter + "%");
                if (!string.IsNullOrEmpty(searchTerm))
                {
                    String searchTermFormat = String.Format("%{0}%", searchTerm);

                    //if (extraFilters.Count > 0)
                    workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null);           //  (

                    workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null);           //      (
                    workCriteria.AddFilterField(WCField.ActivityName, WCCompare.Like, searchTermFormat);                //          ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.ProcessData, "BPC", WCCompare.Equal, searchTerm); //          OR ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.EventName, WCCompare.Like, searchTermFormat);     //          OR ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.ProcessFolio, WCCompare.Like, searchTermFormat);  //          OR ...
                    workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);             //      )     

                    if (extraFilters.Count > 0)
                    {
                        workCriteria.AddFilterField(WCLogical.And, WCField.None, WCCompare.Equal, null);                //      AND
                        workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null);       //      (
                        workCriteria.AddFilterField(WCField.ProcessFolio, WCCompare.Like, propertyFilter);              //          ...
                        workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);         //      )                        
                    }

                    if (!String.IsNullOrEmpty(actExtraFilter))
                        //  TODO: OR event name?
                        //workCriteria.AddFilterField(WCField.EventName, WCCompare.Equal, actExtraFilter);                     //     ...
                        workCriteria.AddFilterField(WCLogical.And, WCField.ActivityName, WCCompare.Equal, actExtraFilter);                     //     ...

                    //if (extraFilters.Count > 0)
                    workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);             //  )
                    //workCriteria.AddFilterField(WCField., WCField.None, WCCompare.Equal, null);
                }
                else
                {
                    if (extraFilters.Count > 0)
                    {
                        workCriteria.AddFilterField(WCField.ProcessFolio, WCCompare.Like, propertyFilter);
                        
                    }
                    
                    if (!String.IsNullOrEmpty(actExtraFilter))
                        workCriteria.AddFilterField(WCLogical.And, WCField.ActivityName, WCCompare.Equal , actExtraFilter);                     //     ...
                }

                //  No AND required - seems like bug - this bit gets put in a different bit of the query K2 creates.
                //  Hide allocated items like the SharePoint K2 worlist does by default.
                //  workCriteria.AddFilterField(WCField.WorklistItemStatus, WCCompare.NotEqual, WorklistStatus.Allocated);

                //workCriteria.AddSortField(WCField.ActivityStartDate, WCSortOrder.Descending);

                workCriteria.StartIndex = skip;
                workCriteria.Count = take;

                foreach (KeyValuePair<WCField, WCSortOrder> sort in sorts)
                {
                    workCriteria.AddSortField(sort.Key, sort.Value);
                }

                Worklist k2Worklist = k2Connection.OpenWorklist(workCriteria);

                foreach (WorklistItem item in k2Worklist)
                {
                    retArray.Add(new WorkflowItem(item));
                }

                count = k2Worklist.TotalCount;
                //  Total records before filter
                totalCount = k2Worklist.TotalCount; 

                return retArray;
            }
        }
Example #45
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();
                }
            }
        }
        public async Task<GetUserWorkflowItemsDto> GetWorkflowItemsAsync(String searchTerm, Int32 skip, Int32 take,
                                                                         Dictionary<WCField, WCSortOrder> sorts,
                                                                         String impersonateUser,
                                                                         List<Tuple<String, String, String>>
                                                                             extraFilters)
        {
            Tuple<String, String, String> cobEF = null;
            Tuple<String, String, String> yearEF = null;
            Tuple<String, String, String> insdEF = null;
            Tuple<String, String, String> uwrEF = null;
            Tuple<String, String, String> actEF = null;

            if (extraFilters != null)
            {
                cobEF = extraFilters.FirstOrDefault(f => f.Item1 == "COBId");
                yearEF = extraFilters.FirstOrDefault(f => f.Item1 == "AccountYear");
                insdEF = extraFilters.FirstOrDefault(f => f.Item1 == "InsuredName");
                uwrEF = extraFilters.FirstOrDefault(f => f.Item1 == "UnderwriterCode");
                actEF = extraFilters.FirstOrDefault(f => f.Item1 == "Activity");
            }
            String cobExtraFilter = cobEF == null ? String.Empty : cobEF.Item3;
            Int32 yearParse;
            Int32? yearExtraFilter = null;
            if (Int32.TryParse(yearEF == null ? String.Empty : yearEF.Item3, out yearParse))
                yearExtraFilter = yearParse;

            String insdExtraFilter = insdEF == null ? String.Empty : insdEF.Item3;
            String uwrExtraFilter = uwrEF == null ? String.Empty : uwrEF.Item3;
            String actExtraFilter = actEF == null ? String.Empty : actEF.Item3;

            List<WorkflowItem> retArray = new List<WorkflowItem>();
            using (var k2Connection = new Connection())
            {
                ConnectionSetup k2Setup = new ConnectionSetup();
                k2Setup.ConnectionString = Properties.Settings.Default.WorkflowServerConnectionString;

                k2Connection.Open(k2Setup);

                if (!String.IsNullOrEmpty(impersonateUser))
                    k2Connection.ImpersonateUser(impersonateUser);

                var workCriteria = new WorklistCriteria { NoData = true, Platform = "ASP" };

                String propertyFilter = String.Format("% / {0} / {1}%{2} / % / {3}",
                                                      String.IsNullOrEmpty(uwrExtraFilter) ? "%" : uwrExtraFilter,
                                                      cobExtraFilter,
                                                      yearExtraFilter == null
                                                          ? String.Empty
                                                          : yearExtraFilter.ToString().Substring(2),
                                                      String.IsNullOrEmpty(insdExtraFilter)
                                                          ? "%"
                                                          : "%" + insdExtraFilter + "%");
                if (!string.IsNullOrEmpty(searchTerm))
                {
                    String searchTermFormat = String.Format("%{0}%", searchTerm);

                    //if (extraFilters.Count > 0)
                    workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null); //  (

                    workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null); //      (
                    workCriteria.AddFilterField(WCField.ActivityName, WCCompare.Like, searchTermFormat); //          ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.ProcessData, "BPC", WCCompare.Equal, searchTerm);
                    //          OR ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.EventName, WCCompare.Like, searchTermFormat);
                    //          OR ...
                    workCriteria.AddFilterField(WCLogical.Or, WCField.ProcessFolio, WCCompare.Like, searchTermFormat);
                    //          OR ...
                    workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);
                    //      )     

                    if (extraFilters != null && extraFilters.Count > 0)
                    {
                        workCriteria.AddFilterField(WCLogical.And, WCField.None, WCCompare.Equal, null); //      AND
                        workCriteria.AddFilterField(WCLogical.StartBracket, WCField.None, WCCompare.Equal, null);
                        //      (
                        workCriteria.AddFilterField(WCField.ProcessFolio, WCCompare.Like, propertyFilter);
                        //          ...
                        workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null);
                        //      )                        
                    }

                    if (!String.IsNullOrEmpty(actExtraFilter))
                        //  TODO: OR event name?
                        //workCriteria.AddFilterField(WCField.EventName, WCCompare.Equal, actExtraFilter);                     //     ...
                        workCriteria.AddFilterField(WCLogical.And, WCField.ActivityName, WCCompare.Equal, actExtraFilter);
                    //     ...

                    workCriteria.AddFilterField(WCLogical.EndBracket, WCField.None, WCCompare.Equal, null); //  )
                }
                else
                {
                    if (extraFilters != null && extraFilters.Count > 0)
                    {
                        workCriteria.AddFilterField(WCField.ProcessFolio, WCCompare.Like, propertyFilter);

                    }

                    if (!String.IsNullOrEmpty(actExtraFilter))
                        workCriteria.AddFilterField(WCLogical.And, WCField.ActivityName, WCCompare.Equal, actExtraFilter);
                    //     ...
                }

                //  No AND required - seems like bug - this bit gets put in a different bit of the query K2 creates.
                //  Hide allocated items like the SharePoint K2 worlist does by default.
                //  workCriteria.AddFilterField(WCField.WorklistItemStatus, WCCompare.NotEqual, WorklistStatus.Allocated);
                
                workCriteria.StartIndex = skip;
                workCriteria.Count = take;

                foreach (KeyValuePair<WCField, WCSortOrder> sort in sorts)
                {
                    workCriteria.AddSortField(sort.Key, sort.Value);
                }

                var dto = new GetUserWorkflowItemsDto();
                var task = new Task<GetUserWorkflowItemsDto>
                    (
                    () =>
                    {
                        var k2Worklist = k2Connection.OpenWorklist(workCriteria);

                        retArray.AddRange(from WorklistItem item in k2Worklist select new WorkflowItem(item));

                        dto.WorkflowItemsArray = retArray.ToArray();
                        dto.TotalDisplayRecords = k2Worklist.TotalCount;
                        dto.TotalRecords = k2Worklist.TotalCount;

                        return dto;
                    }
                    );

                // Start the task
                task.Start();

                // Get the result from the task - analogous to 
                // calling task.Result (without the thread blocking)
                var result = await task;
                return result;
            }
        }