private void GetWorklist()
        {
            ServiceObject serviceObject = base.ServiceBroker.Service.ServiceObjects[0];

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

            using (Connection k2Con = base.ServiceBroker.K2Connection.GetWorkflowClientConnection())
            {
                WorklistCriteria wc = new WorklistCriteria();
                wc.Platform = base.Platform;
                AddFieldFilters(wc);
                if (base.GetBoolProperty(Constants.SOProperties.ClientWorklist.IncludeShared) == true)
                {
                    wc.AddFilterField(WCLogical.Or, WCField.WorklistItemOwner, "Me", WCCompare.Equal, WCWorklistItemOwner.Me);
                    wc.AddFilterField(WCLogical.Or, WCField.WorklistItemOwner, "Other", WCCompare.Equal, WCWorklistItemOwner.Other);
                }
                if (base.GetBoolProperty(Constants.SOProperties.ClientWorklist.ExcludeAllocated) == true)
                {
                    wc.AddFilterField(WCLogical.And, WCField.WorklistItemStatus, WCCompare.NotEqual, WorklistStatus.Allocated);
                }
                Worklist wl = k2Con.OpenWorklist(wc);

                foreach (WorklistItem wli in wl)
                {
                    AddRowToDataTable(results, wli);
                }

                k2Con.Close();
            }
        }
Example #2
0
 public static WorklistItem GetWorklistItem(int processInstanceId)
 {
     using (Connection conn = new Connection())
     {
         WorklistItem retitem = null;
         try
         {
             conn.Open(K2ServerName, GetConnString());
             Worklist list = conn.OpenWorklist();
             foreach (WorklistItem item in list)
             {
                 //item.ProcessInstance.Originator发起人
                 if (item.ProcessInstance.ID == processInstanceId)
                 {
                     retitem = item;
                 }
             }
         }
         catch
         {
             throw;
         }
         finally
         {
             conn.Close();
         }
         return(retitem);
     }
 }
Example #3
0
 /// <summary>
 /// Get all worklist items of current user
 /// </summary>
 /// <returns>The worklist items</returns>
 public Worklist GetWorklists()
 {
     using (Connection conn = GetWorkflowClient())
     {
         return(conn.OpenWorklist());
     }
 }
        public List<SA4Launcher.Models.WorklistItem> LoadWorkList()
        {
            Connection K2Conn = new Connection();
            SCConnectionStringBuilder K2ConnString = new SCConnectionStringBuilder();
            List<SA4Launcher.Models.WorklistItem> _currentWorkList = new List<SA4Launcher.Models.WorklistItem>();

            //Setup Connection String

            K2ConnString.Host = "Sa4DemoK2wAD";
            K2ConnString.Integrated = false;
            K2ConnString.UserID = "SA4Demo\\Tberry";
            K2ConnString.Password = "******";
            K2ConnString.Port = 5252;
            K2ConnString.WindowsDomain = "Sa4Demo";
            K2ConnString.SecurityLabelName = "K2";
            K2ConnString.Authenticate = false;
            K2ConnString.IsPrimaryLogin = true;
            K2Conn.Open("Sa4DemoK2wAD", K2ConnString.ConnectionString.ToString());

            //TODO:  Need to add try loop with true false return
            Worklist K2WorkList = K2Conn.OpenWorklist();
            List<SA4Launcher.Models.Action> CurrentActions = new List<SA4Launcher.Models.Action>();

            if (K2WorkList != null)
            {
                _currentWorkList.Clear();
                foreach (SourceCode.Workflow.Client.WorklistItem K2worklistitem in K2WorkList)
                {
                    //Build Actions First
                    CurrentActions.Clear();
                    foreach (SourceCode.Workflow.Client.Action K2action in K2worklistitem.Actions)
                    {
                        CurrentActions.Add(new SA4Launcher.Models.Action
                        {
                            Name = K2action.Name,
                            Batchable = K2action.Batchable
                        });
                    }

                    //Load worklist items into model
                    _currentWorkList.Add(new SA4Launcher.Models.WorklistItem
                    {
                        ID = K2worklistitem.ID,
                        serialno = K2worklistitem.SerialNumber,
                        Name = K2worklistitem.ProcessInstance.Name,
                        UserName = K2worklistitem.AllocatedUser,
                        Folio = K2worklistitem.ProcessInstance.Folio,
                        StartDate = K2worklistitem.ProcessInstance.StartDate,
                        Status = K2worklistitem.Status.ToString(),
                        ViewFlow = K2worklistitem.ProcessInstance.ViewFlow,
                        Data = K2worklistitem.Data,
                        Priority = K2worklistitem.ProcessInstance.Priority,
                        Actions = CurrentActions.ToList()
                    });
                }
            }
            K2Conn.Close();
            return (_currentWorkList);
        }
Example #5
0
        private WorklistItem GetProcInst(int proctInstId, int actDestInstId = 0)
        {
            string serialNumber = string.Format("{0}_{1}", proctInstId.ToString(), actDestInstId.ToString());

            var K2Crit = new WorklistCriteria();

            K2Crit.NoData   = true;  //faster, does not return the data for each item
            K2Crit.Platform = "ASP"; //helps when multiple platform are used

            K2Crit.AddFilterField(
                WCLogical.Or, WCField.WorklistItemOwner, "Me",
                WCCompare.Equal, WCWorklistItemOwner.Me
                );

            K2Crit.AddFilterField(
                WCLogical.Or, WCField.WorklistItemOwner, "Other",
                WCCompare.Equal, WCWorklistItemOwner.Other
                );

            K2Crit.AddFilterField(
                WCLogical.And, WCField.SerialNumber,
                WCCompare.Equal, string.Format("{0}_{1}", proctInstId.ToString(), actDestInstId.ToString())
                );

            var K2WList = _connection.OpenWorklist(K2Crit);

            foreach (WorklistItem K2WLItem in K2WList)
            {
                if (actDestInstId > 0)
                {
                    if (K2WLItem.ProcessInstance.ID == proctInstId)
                    {
                        return(K2WLItem);
                    }
                }
                else
                {
                    if (K2WLItem.ProcessInstance.ID == proctInstId && K2WLItem.AllocatedUser == ManagedUser)
                    {
                        return(K2WLItem);
                    }
                }
            }
            return(null);
        }
        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;
            }
        }
Example #7
0
        /// <summary>
        /// 获取当前审批者列表(包括委托)
        /// </summary>
        /// <param name="ApproverUser"></param>
        public static List <ApprovalWorklistItem> GetCurrentUserWorkListItem(string ApproverUser)
        {
            Connection connection = GetK2Connection();

            try
            {
                ImpersonateUser(connection, ApproverUser);
                List <ApprovalWorklistItem> ApprovalWorklistItemList = new List <ApprovalWorklistItem>();
                //获取审批列表添加条件
                SourceCode.Workflow.Client.WorklistCriteria criteria = new SourceCode.Workflow.Client.WorklistCriteria();
                criteria.Platform = "ASP";
                //添加流程文件类别条件
                criteria.AddFilterField(SourceCode.Workflow.Client.WCLogical.And, SourceCode.Workflow.Client.WCField.ProcessFolder, SourceCode.Workflow.Client.WCCompare.Equal, GetK2ProcessFolder());
                //添加审批者的列表
                criteria.AddFilterField(SourceCode.Workflow.Client.WCLogical.And, SourceCode.Workflow.Client.WCField.WorklistItemOwner, "Me", SourceCode.Workflow.Client.WCCompare.Equal, SourceCode.Workflow.Client.WCWorklistItemOwner.Me);

                //添加审批者委托的列表
                //criteria.AddFilterField(SourceCode.Workflow.Client.WCLogical.Or, SourceCode.Workflow.Client.WCField.WorklistItemOwner, "Other", SourceCode.Workflow.Client.WCCompare.Equal, SourceCode.Workflow.Client.WCWorklistItemOwner.Other);
                Worklist worklist = connection.OpenWorklist(criteria);

                if (worklist != null && worklist.Count > 0)
                {
                    foreach (SourceCode.Workflow.Client.WorklistItem item in worklist)
                    {
                        var work = new ApprovalWorklistItem();
                        work.SN              = item.SerialNumber;
                        work.ProcInstID      = item.ProcessInstance.ID.ToString();
                        work.ProcessName     = item.ProcessInstance.Name.Substring(4, item.ProcessInstance.Name.Length - 4);
                        work.Folio           = item.ProcessInstance.Folio;
                        work.StartDate       = item.ActivityInstanceDestination.StartDate.ToString("yyyy-MM-dd HH:mm:ss");
                        work.CurActivityName = item.ActivityInstanceDestination.Name;
                        work.URL             = item.Data;

                        ApprovalWorklistItemList.Add(work);
                    }
                    ApprovalWorklistItemList.OrderByDescending(a => a.StartDate);
                }
                return(ApprovalWorklistItemList);
            }
            catch (Exception ex)
            {
                throw new K2Exception(ex.ToString());
            }
            finally
            {
                // 关闭连接
                if (connection != null)
                {
                    connection.Close();
                }
            }
        }
        //opening worklist sample
        public static void OpenWorklistSamples()
        {
            //you must open a K2 connection first. We will wrap the K2 connection into a using statement to ensure that it is closed
            using (Connection K2Conn = new Connection())
            {
                K2Conn.Open("[servername]");
                //retrieve the entire worklist for the current user
                Worklist K2WList = K2Conn.OpenWorklist();

                //or retrieve the worklist for a specific platform ("platform" not really used that often anymore). The default platform for worklist items is ASP
                Worklist K2WList1 = K2Conn.OpenWorklist("ASP");

                //or retrieve the worklist for a specific platform and a user managed by the current user.
                //This requires that the reporting structure is set up correctly in the underlying user provider (Active Directory or custom user manager)
                Worklist K2WList2 = K2Conn.OpenWorklist("ASP", @"[domain\username]");

                //you can also retrieve the worklist with a criteria filter. OpenWorklist can be an expensive operation, so use criteria to perform server-side filtering of the worklist
                //for large worklists you should always use criteria to reduce the size of the worklist that is returned to the client
                WorklistCriteria K2Crit = new WorklistCriteria();
                //you can set up various combinations of filters and sorts in the criteria object. Refer to the product documentation for more samples
                //here, we are filtering for all workflows for the project K2Learning where the priority equals 1. We want to sort the task list by workflow start date
                K2Crit.AddFilterField(WCField.ProcessFolder, WCCompare.Equal, "[FolderName]");
                K2Crit.AddFilterField(WCLogical.And, WCField.ProcessPriority, WCCompare.Equal, 1);
                K2Crit.AddSortField(WCField.ProcessStartDate, WCSortOrder.Descending);
                Worklist K2WList3 = K2Conn.OpenWorklist(K2Crit);

                int numberOfTasks = K2WList.TotalCount;

                //once you have retrieved the worklist, you can iterate over the worklist items in the worklist
                foreach (WorklistItem K2WLItem in K2WList)
                {
                    string serialNumber = K2WLItem.SerialNumber;
                    string status       = K2WLItem.Status.ToString();
                    //to access more information, drill down into the relevant object contained in the worklist item
                    string Folio = K2WLItem.ProcessInstance.Folio;
                }
            }
        }
Example #9
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 #10
0
        /// <summary>
        /// Get worklist items by worklist filter criterias
        /// </summary>
        /// <param name="wlc">The worklist criteria</param>
        /// <returns>The collection of worklist items</returns>
        public WorklistItemCollection OpenWorklist(WorklistCriteria wlc)
        {
            WorklistItemCollection result;

            try {
                using (Connection workflowClient = this.GetWorkflowClient()) {
                    result = WorklistItemCollection.FromApi(workflowClient.OpenWorklist(wlc));
                }
            } catch (UnauthorizedAccessException) {
                throw;
            } catch (SmartException ex) {
                throw ex;
            }
            return(result);
        }
Example #11
0
        /// <summary>
        /// Get worklist item by worklist filter criterias
        /// </summary>
        /// <param name="filter">The worklist filter criterias</param>
        /// <param name="actDataField">The activity data field</param>
        /// <param name="actXmlField">The activity xml field</param>
        /// <param name="piDataField">The pi data field</param>
        /// <param name="piXmlField">The pi xml field</param>
        /// <returns></returns>
        public WorklistItemCollection OpenWorklistFiltered(Criteria filter, bool actDataField, bool actXmlField, bool piDataField, bool piXmlField)
        {
            WorklistItemCollection result;

            try {
                using (Connection workflowClient = this.GetWorkflowClient()) {
                    WorklistCriteria criteria = filter.ToApi();
                    result = WorklistItemCollection.FromApi(workflowClient.OpenWorklist(criteria));
                }
            } catch (System.UnauthorizedAccessException ex) {
                throw ex;
            } catch (System.Exception ex) {
                throw ex;
            }
            return(result);
        }
Example #12
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();
            }
        }
        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 #15
0
        private void ActionWorklistitem()
        {
            string processInstanceId = base.GetStringProperty(Constants.SOProperties.ClientWorklist.ProcessId, true);
            string activityName      = base.GetStringProperty(Constants.SOProperties.ClientWorklist.ActivityName, true);
            string actionName        = base.GetStringProperty(Constants.SOProperties.ClientWorklist.ActionName, true);


            using (Connection k2Con = new Connection())
            {
                k2Con.Open(base.K2ClientConnectionSetup);

                WorklistCriteria wc = new WorklistCriteria();
                wc.Platform = base.Platform;
                wc.AddFilterField(WCField.ProcessID, WCCompare.Equal, processInstanceId);
                wc.AddFilterField(WCLogical.And, WCField.ActivityName, WCCompare.Equal, activityName);
                Worklist wl = k2Con.OpenWorklist(wc);

                if (wl.TotalCount == 0)
                {
                    throw new ApplicationException("No worklist item found with those criteria.");
                }

                if (wl.TotalCount > 1)
                {
                    throw new ApplicationException("More than one worklist item found with those criteria.");
                }


                foreach (SourceCode.Workflow.Client.Action a in wl[0].Actions)
                {
                    if (string.Compare(a.Name, actionName, true) == 0)
                    {
                        a.Execute();
                        k2Con.Close();
                        return;
                    }
                }
                k2Con.Close();

                throw new ApplicationException("Failed to find the action specified. Worklist item was found.");
            }
        }
        private void ActionWorklistitem()
        {
            string processInstanceId = base.GetStringProperty(Constants.SOProperties.ClientWorklist.ProcessId, true);
            string activityName      = base.GetStringProperty(Constants.SOProperties.ClientWorklist.ActivityName, true);
            string actionName        = base.GetStringProperty(Constants.SOProperties.ClientWorklist.ActionName, true);



            using (Connection k2Con = this.ServiceBroker.K2Connection.GetWorkflowClientConnection())
            {
                WorklistCriteria wc = new WorklistCriteria();
                wc.Platform = base.Platform;
                wc.AddFilterField(WCField.ProcessID, WCCompare.Equal, processInstanceId);
                wc.AddFilterField(WCLogical.And, WCField.ActivityName, WCCompare.Equal, activityName);
                Worklist wl = k2Con.OpenWorklist(wc);

                if (wl.TotalCount == 0)
                {
                    throw new ApplicationException(Resources.NoWorklistItemFound);
                }

                if (wl.TotalCount > 1)
                {
                    throw new ApplicationException(Resources.MoreThanOneWorklistItemFound);
                }


                foreach (SourceCode.Workflow.Client.Action a in wl[0].Actions)
                {
                    if (string.Compare(a.Name, actionName, true) == 0)
                    {
                        a.Execute();
                        k2Con.Close();
                        return;
                    }
                }
                k2Con.Close();

                throw new ApplicationException(Resources.FailedToFindTheAction);
            }
        }
Example #17
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 #18
0
 public static Worklist GetAllWorkItem(string Account)
 {
     using (Connection conn = new Connection())
     {
         Worklist retitem = null;
         try
         {
             conn.Open(K2ServerName, GetConnString());
             conn.RevertUser();
             conn.ImpersonateUser(Account);
             retitem = conn.OpenWorklist();
         }
         catch
         {
             throw;
         }
         finally
         {
             conn.Close();
         }
         return(retitem);
     }
 }
Example #19
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;
            }
        }
        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;
            }
        }
        //opening and completing a worklist item samples
        public static void OpenWorklistItemSamples()
        {
            //you must open a K2 connection first. We will wrap the K2 connection into a using statement to ensure that it is closed
            using (Connection K2Conn = new Connection())
            {
                K2Conn.Open("[servername]");

                //to open a worklist item you require at least the item's serial number
                //opening a worklist item without any overrides will automatically set the item's status to "Opened" by the connected user.
                WorklistItem K2WListItem = K2Conn.OpenWorklistItem("[serialnumber]");


                //once you have opened the item, you can read data from the item or update data in the workflow
                string oldFolio = K2WListItem.ProcessInstance.Folio;
                K2WListItem.ProcessInstance.Folio = "[NewFolio]";
                K2WListItem.ProcessInstance.DataFields["[String DataField Name]"].Value = "[updatedvalue]";

                //to update the process without completing the task, call Update as follows.


                //to update the worklist item and finish the task, you must call the Action.Execute method
                //the workflow will then continue executing according to the action selected
                //warning: you must select one of the available actiosn for the current task, otherwise an error will be reported
                K2WListItem.Actions["[ActionName]"].Execute();

                //to get the available actions for the task, query the Actions collection
                foreach (SourceCode.Workflow.Client.Action action in K2WListItem.Actions)
                {
                    //do something with the actions. Normally, you would output the available actions into a drop-down list
                    //or perhaps generate new button controls for each available action
                }

                //if you have want to open a worklist item from a managed user's tasklist, you need to use the OpenManagedWorklistItem method:
                K2WListItem = K2Conn.OpenManagedWorklistItem("[managedUserUsername]", "[serialNumber]");

                //if you are openeing another user's worklist item that was delegated to the current account with Out of Office, you need
                //to use the OpenSharedWorklistItem method
                K2WListItem = K2Conn.OpenSharedWorklistItem("[originalUserName]", "[managedUserName]", "[serialNumber]");


                //if you do not have the serial number, you can iterate over the worklist to open a worklist item
                //note: returning the worklist and iterating over the list can be an expensive operation
                //for the purposes of this exercise we will check if the worklist item folio is a specific value. A more efficient way would be to set up a
                //worklist criteria filter to filter the tasks based on the folio we are looking for
                Worklist K2WList = K2Conn.OpenWorklist();
                //once you have retrived the worklist, you can iterate over the worklist items in the worklist
                foreach (WorklistItem K2WLItem in K2WList)
                {
                    if (K2WLItem.ProcessInstance.Folio == "[somefolio]")
                    {
                        //you must open the worklist item before you can update it or complete it
                        K2WLItem.Open();
                        K2WLItem.ProcessInstance.Folio = "[NewFolio]";
                        K2WLItem.ProcessInstance.DataFields["[SomeDataField]"].Value = "[updatedvalue]";
                        //to update the worklist item and finish it, you must call the Action.Execute method
                        //the workflow will then continue executing accoridng to the action selected
                        K2WLItem.Actions["[ActionName]"].Execute();
                    }
                }
            }
        }
        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;

            }
        }
        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;
            }
        }
Example #24
0
        private void GetWorklist()
        {
            ServiceObject serviceObject = base.ServiceBroker.Service.ServiceObjects[0];
            serviceObject.Properties.InitResultTable();
            DataTable results = base.ServiceBroker.ServicePackage.ResultTable;

            using (Connection k2Con = new Connection())
            {
                k2Con.Open(base.K2ClientConnectionSetup);

                WorklistCriteria wc = new WorklistCriteria();
                wc.Platform = base.Platform;
                AddFieldFilters(wc);
                if (base.GetBoolProperty(Constants.SOProperties.ClientWorklist.IncludeShared) == true)
                {
                    wc.AddFilterField(WCLogical.Or, WCField.WorklistItemOwner, "Me", WCCompare.Equal, WCWorklistItemOwner.Me);
                    wc.AddFilterField(WCLogical.Or, WCField.WorklistItemOwner, "Other", WCCompare.Equal, WCWorklistItemOwner.Other);
                }
                if (base.GetBoolProperty(Constants.SOProperties.ClientWorklist.ExcludeAllocated) == true)
                {
                    wc.AddFilterField(WCLogical.And, WCField.WorklistItemStatus, WCCompare.NotEqual, WorklistStatus.Allocated);
                }
                Worklist wl = k2Con.OpenWorklist(wc);

                foreach (WorklistItem wli in wl)
                {
                    AddRowToDataTable(results, wli);
                }

                k2Con.Close();
            }
        }
Example #25
0
        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);
            }
        }
Example #26
0
        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> 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);

                    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.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);
            }
        }
        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 #28
0
        public List <IIFWorklistItem> ListIIFWorklistItem(IIFWorklistItem_Filter filter)
        {
            List <IIFWorklistItem> result = new List <IIFWorklistItem>();

            Dictionary <int, List <IIFWorklistItem> > dictWfItem = new Dictionary <int, List <IIFWorklistItem> >();

            using (Connection k2Con = new Connection())
            {
                k2Con.Open(this.AppConfig.K2Server);
                if (filter != null)
                {
                    if (!string.IsNullOrEmpty(filter.Destination))
                    {
                        k2Con.ImpersonateUser(filter.Destination);
                    }
                }

                WorklistCriteria worklistCriteria = new WorklistCriteria();
                worklistCriteria.Platform = "ASP";
                worklistCriteria.AddFilterField(WCField.ProcessFullName, WCCompare.Equal, "IIF\\PAM");
                worklistCriteria.AddFilterField(WCLogical.Or, WCField.ProcessFullName, WCCompare.Equal, "IIF\\CM");
                worklistCriteria.AddFilterField(WCLogical.Or, WCField.WorklistItemOwner, "Me", WCCompare.Equal, WCWorklistItemOwner.Me);
                worklistCriteria.AddFilterField(WCLogical.Or, WCField.WorklistItemOwner, "Other", WCCompare.Equal, WCWorklistItemOwner.Other);

                Worklist worklist = k2Con.OpenWorklist(worklistCriteria);

                foreach (WorklistItem item in worklist)
                {
                    IIFWorklistItem newData = new IIFWorklistItem();
                    newData.K2ProcessId           = item.ProcessInstance.ID;
                    newData.SN                    = item.SerialNumber;
                    newData.K2CurrentActivityName = item.ActivityInstanceDestination.DisplayName;
                    if (!dictWfItem.ContainsKey(newData.K2ProcessId))
                    {
                        dictWfItem.Add(newData.K2ProcessId, new List <IIFWorklistItem>());
                    }
                    newData.SharedUserFQN = item.AllocatedUser;
                    dictWfItem[newData.K2ProcessId].Add(newData);
                }
            }

            if (dictWfItem.Count > 0)
            {
                string conStringIIF = this.AppConfig.IIFConnectionString;
                using (SqlConnection con = new SqlConnection(conStringIIF))
                {
                    con.Open();

                    string queryInValue = string.Empty;
                    foreach (int k2ProcessId in dictWfItem.Keys)
                    {
                        if (string.IsNullOrEmpty(queryInValue))
                        {
                            queryInValue = k2ProcessId.ToString();
                        }
                        else
                        {
                            queryInValue = queryInValue + ", " + k2ProcessId.ToString();
                        }
                    }

                    string query = "SELECT [K2ProcessId], [Id]";
                    query = query + ", [MDocTypeId], [MDocTypeName], [MProductTypeId], [MProductTypeName]";
                    query = query + ", [ProjectCode], [CustomerName], [SubmitDate], [CMNumber]";
                    query = query + ", [IsInRevise]";
                    query = query + ", [MWorkflowStatusId], [MWorkflowStatusName]";
                    query = query + ", [ModifiedBy], [ModifiedOn]";
                    query = query + " FROM [dbo].[Vw_SubmissionList]";
                    query = query + " WHERE [K2ProcessId] IN (";
                    query = query + queryInValue;
                    query = query + " )";

                    using (SqlCommand cmd = con.CreateCommand())
                    {
                        cmd.CommandType = CommandType.Text;

                        #region Filter
                        if (filter != null)
                        {
                            if (filter.SubmitDate_FROM.HasValue)
                            {
                                query = query + " AND CONVERT(DATE, [SubmitDate]) >= @SubmitDate_FROM";
                                cmd.Parameters.Add(this.NewSqlParameter("SubmitDate_FROM", SqlDbType.Date, filter.SubmitDate_FROM));
                            }

                            if (filter.SubmitDate_TO.HasValue)
                            {
                                query = query + " AND CONVERT(DATE, [SubmitDate]) <= @SubmitDate_TO";
                                cmd.Parameters.Add(this.NewSqlParameter("SubmitDate_TO", SqlDbType.Date, filter.SubmitDate_TO));
                            }

                            if (!string.IsNullOrEmpty(filter.ProjectCode_LIKE))
                            {
                                query = query + " AND [ProjectCode] LIKE '%' + @ProjectCode_LIKE + '%'";
                                cmd.Parameters.Add(this.NewSqlParameter("ProjectCode_LIKE", SqlDbType.VarChar, filter.ProjectCode_LIKE));
                            }

                            if (!string.IsNullOrEmpty(filter.CustomerName_LIKE))
                            {
                                query = query + " AND [CustomerName] LIKE '%' + @CustomerName_LIKE + '%'";
                                cmd.Parameters.Add(this.NewSqlParameter("CustomerName_LIKE", SqlDbType.VarChar, filter.CustomerName_LIKE));
                            }

                            if (filter.ProductTypeId.HasValue)
                            {
                                query = query + " AND [MProductTypeId] = @ProductTypeId";
                                cmd.Parameters.Add(this.NewSqlParameter("ProductTypeId", SqlDbType.Int, filter.ProductTypeId));
                            }

                            if (filter.MDocTypeId.HasValue)
                            {
                                query = query + " AND [MDocTypeId] = @MDocTypeId";
                                cmd.Parameters.Add(this.NewSqlParameter("MDocTypeId", SqlDbType.VarChar, filter.MDocTypeId.Value));
                            }

                            if (!string.IsNullOrEmpty(filter.CMNumber_LIKE))
                            {
                                query = query + " AND [CMNumber] LIKE '%' + @CMNumber_LIKE + '%'";
                                cmd.Parameters.Add(this.NewSqlParameter("CMNumber_LIKE", SqlDbType.VarChar, filter.CMNumber_LIKE));
                            }
                        }
                        #endregion

                        cmd.CommandText = query;

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            int indexOf_K2ProcessId         = dr.GetOrdinal("K2ProcessId");
                            int indexOf_Id                  = dr.GetOrdinal("Id");
                            int indexOf_MDocTypeId          = dr.GetOrdinal("MDocTypeId");
                            int indexOf_MDocTypeName        = dr.GetOrdinal("MDocTypeName");
                            int indexOf_MProductTypeId      = dr.GetOrdinal("MProductTypeId");
                            int indexOf_MProductTypeName    = dr.GetOrdinal("MProductTypeName");
                            int indexOf_ProjectCode         = dr.GetOrdinal("ProjectCode");
                            int indexOf_CustomerName        = dr.GetOrdinal("CustomerName");
                            int indexOf_SubmitDate          = dr.GetOrdinal("SubmitDate");
                            int indexOf_CMNumber            = dr.GetOrdinal("CMNumber");
                            int indexOf_IsInRevise          = dr.GetOrdinal("IsInRevise");
                            int indexOf_MWorkflowStatusId   = dr.GetOrdinal("MWorkflowStatusId");
                            int indexOf_MWorkflowStatusName = dr.GetOrdinal("MWorkflowStatusName");
                            int indexOf_ModifiedBy          = dr.GetOrdinal("ModifiedBy");
                            int indexOf_ModifiedOn          = dr.GetOrdinal("ModifiedOn");

                            while (dr.Read())
                            {
                                int k2ProcessId = dr.GetInt32(indexOf_K2ProcessId);

                                if (dictWfItem.ContainsKey(k2ProcessId))
                                {
                                    foreach (IIFWorklistItem data in dictWfItem[k2ProcessId])
                                    {
                                        Logger.Error("DocumentId: " + dr.GetInt64(indexOf_Id));
                                        Logger.Error("MDocTypeId: " + dr.GetInt32(indexOf_MDocTypeId));
                                        Logger.Error("MDocTypeName: " + dr.GetNullableString(indexOf_MDocTypeName));
                                        Logger.Error("ProductTypeId: " + dr.GetInt32(indexOf_MProductTypeId));
                                        Logger.Error("ProductTypeName: " + dr.GetNullableString(indexOf_MProductTypeName));
                                        Logger.Error("ProjectCode: " + dr.GetNullableString(indexOf_ProjectCode));
                                        Logger.Error("CustomerName: " + dr.GetNullableString(indexOf_CustomerName));
                                        //Logger.Error("SubmitDate: " + dr.GetDateTime(indexOf_SubmitDate));
                                        Logger.Error("CMNumber: " + dr.GetNullableString(indexOf_CMNumber));
                                        Logger.Error("IsInRevise: " + dr.GetBoolean(indexOf_IsInRevise));
                                        Logger.Error("WorkflowStatusId: " + dr.GetInt32(indexOf_MWorkflowStatusId));
                                        Logger.Error("WorkflowStatusName: " + dr.GetNullableString(indexOf_MWorkflowStatusName));
                                        Logger.Error("ModifiedBy: " + dr.GetNullableString(indexOf_ModifiedBy));
                                        //Logger.Error("ModifiedOn: " + dr.GetDateTime(indexOf_ModifiedOn));

                                        data.DocumentId      = dr.GetInt64(indexOf_Id);
                                        data.MDocTypeId      = dr.GetInt32(indexOf_MDocTypeId);
                                        data.MDocTypeName    = dr.GetNullableString(indexOf_MDocTypeName);
                                        data.ProductTypeId   = dr.GetInt32(indexOf_MProductTypeId);
                                        data.ProductTypeName = dr.GetNullableString(indexOf_MProductTypeName);
                                        data.ProjectCode     = dr.GetNullableString(indexOf_ProjectCode);
                                        data.CustomerName    = dr.GetNullableString(indexOf_CustomerName);
                                        try
                                        {
                                            data.SubmitDate = dr.GetDateTime(indexOf_SubmitDate);
                                        }
                                        catch
                                        {
                                        }

                                        data.CMNumber           = dr.GetNullableString(indexOf_CMNumber);
                                        data.IsInRevise         = dr.GetBoolean(indexOf_IsInRevise);
                                        data.WorkflowStatusId   = dr.GetInt32(indexOf_MWorkflowStatusId);
                                        data.WorkflowStatusName = dr.GetNullableString(indexOf_MWorkflowStatusName);
                                        data.ModifiedBy         = dr.GetNullableString(indexOf_ModifiedBy);

                                        try
                                        {
                                            data.ModifiedOn = dr.GetDateTime(indexOf_ModifiedOn);
                                        }
                                        catch
                                        {
                                        }

                                        if ((data.K2CurrentActivityName.ToUpper() == "Submit MoM BoD".ToUpper()) || (data.K2CurrentActivityName.ToUpper() == "Submit MoM BoC".ToUpper()))
                                        {
                                            data.TaskListStatus = "Responded (Risk Team)";
                                        }
                                        else
                                        {
                                            data.TaskListStatus = data.WorkflowStatusName;
                                        }

                                        result.Add(data);
                                    }
                                }
                            }
                        }
                    }
                    con.Close();
                }
            }

            return(result);
        }
        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;
            }
        }