示例#1
0
        /// <summary>
        /// Build a sorted list of TrackingRecords for a single
        /// workflow instance
        /// </summary>
        /// <param name="records"></param>
        /// <param name="instance"></param>
        private static void BuildSortedList(
            SortedList <Int32, TrackingRecord> records,
            SqlTrackingWorkflowInstance instance)
        {
            if (instance != null)
            {
                //add workflow events to the sorted list
                foreach (TrackingRecord record in instance.WorkflowEvents)
                {
                    records.Add(record.EventOrder, record);
                }

                //add activity events to the sorted list
                foreach (TrackingRecord record in instance.ActivityEvents)
                {
                    records.Add(record.EventOrder, record);
                }

                //add user events to the sorted list
                foreach (TrackingRecord record in instance.UserEvents)
                {
                    records.Add(record.EventOrder, record);
                }
            }
        }
示例#2
0
        /// <summary>
        /// Retrieve tracking data from the database for a
        /// workflow instance.
        /// </summary>
        /// <param name="instanceId"></param>
        /// <returns>
        /// Returns a sorted list of all available TrackingRecords
        /// </returns>
        private SortedList <Int32, TrackingRecord> QueryTrackingData(
            Guid instanceId)
        {
            //create a sorted list for all of the tracking records
            SortedList <Int32, TrackingRecord> records
                = new SortedList <int, TrackingRecord>();

            try
            {
                //create an object that queries the tracking database
                SqlTrackingQuery query
                    = new SqlTrackingQuery(_connectionString);

                //retrieve tracking data for a workflow instance
                SqlTrackingWorkflowInstance instance = null;
                query.TryGetWorkflow(instanceId, out instance);

                //build a sorted list of TrackingRecords
                BuildSortedList(records, instance);
            }
            catch (System.Data.SqlClient.SqlException e)
            {
                Console.WriteLine("SqlException in QueryTrackingData: {0}",
                                  e.Message);
            }

            return(records);
        }
示例#3
0
        public static byte[] GetWorkflowGraphic(Guid processId)
        {
            SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance = null;
            SqlTrackingQuery            sqlTrackingQuery            = new SqlTrackingQuery(ConfigurationManager.ConnectionStrings[Constants.Database.TenantWorkflowStore].ConnectionString);

            if (sqlTrackingQuery.TryGetWorkflow(processId, out sqlTrackingWorkflowInstance))
            {
                if ((null != sqlTrackingWorkflowInstance) && (null != sqlTrackingWorkflowInstance.WorkflowDefinition))
                {
                    Dictionary <string, ActivityStatusInfo> activityStatusListValue = new Dictionary <string, ActivityStatusInfo>();
                    for (int index = sqlTrackingWorkflowInstance.ActivityEvents.Count; index >= 1; index--)
                    {
                        ActivityTrackingRecord activityTrackingRecord = sqlTrackingWorkflowInstance.ActivityEvents[index - 1];
                        if (!activityStatusListValue.ContainsKey(activityTrackingRecord.QualifiedName))
                        {
                            ActivityStatusInfo latestActivityStatus = new ActivityStatusInfo(activityTrackingRecord.QualifiedName, activityTrackingRecord.ExecutionStatus.ToString());
                            activityStatusListValue.Add(activityTrackingRecord.QualifiedName, latestActivityStatus);
                        }
                    }

                    Activity workflowDefinition = sqlTrackingWorkflowInstance.WorkflowDefinition;
                    return(Viewer.GetWorkflowImageBinary(workflowDefinition, activityStatusListValue));
                }
            }
            return(null);
        }
示例#4
0
        static public ExportProcessDC GetExportProcessbyContractId(Guid contractId)
        {
            SqlTrackingQuery        sqlTrackingQuery = new SqlTrackingQuery(ConfigurationManager.ConnectionStrings[Constants.Database.TenantWorkflowStore].ConnectionString);
            SqlTrackingQueryOptions options          = new SqlTrackingQueryOptions();

            //options.WorkflowStatus = WorkflowStatus.Running;
            options.TrackingDataItems.Add(new TrackingDataItemValue("ExportProcess", "ObjectId", contractId.ToString()));

            IList <SqlTrackingWorkflowInstance> workflows = sqlTrackingQuery.GetWorkflows(options);

            if (workflows.Count == 0)
            {
                return(null);
            }
            SqlTrackingWorkflowInstance workflow        = workflows[workflows.Count - 1];
            ExportProcessDC             exportProcessDC = new ExportProcessDC();

            exportProcessDC.ObjectId  = contractId;
            exportProcessDC.ProcessId = workflow.WorkflowInstanceId;
            exportProcessDC.Status    = ProcessHelper.ToProcessStatus(workflow.Status);
            int activityEventsCount = workflow.ActivityEvents.Count;

            if (activityEventsCount > 0)
            {
                ActivityTrackingRecord record = (ActivityTrackingRecord)workflow.ActivityEvents[activityEventsCount - 1];
                foreach (TrackingDataItem dataItem in record.Body)
                {
                    switch (dataItem.FieldName)
                    {
                    case "Number":
                        exportProcessDC.Number = (string)dataItem.Data;
                        break;

                    case "Creator":
                        exportProcessDC.Creator = (string)dataItem.Data;
                        break;

                    case "Amount":
                        exportProcessDC.Amount = dataItem.Data == null ? default(decimal) : (decimal)dataItem.Data;
                        break;
                    }
                }
            }
            return(exportProcessDC);
        }
示例#5
0
        //Query the database via the databaseService and update the activities ListView and activityStatusList
        // based on the currently selected workflow instance
        private void UpdateActivities()
        {
            if (listViewWorkflows.SelectedItems.Count == 0)
            {
                listViewActivities.Items.Clear();
                activityStatusListValue.Clear();
                return;
            }

            ListViewItem currentWorkflow = listViewWorkflows.SelectedItems[0];

            if (currentWorkflow != null)
            {
                Guid workflowInstanceId = workflowStatusList[(currentWorkflow.SubItems[0]).Text].InstanceId;

                SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance = null;
                if (true == monitorDatabaseServiceValue.TryGetWorkflow(workflowInstanceId, out sqlTrackingWorkflowInstance))
                {
                    listViewActivities.Items.Clear();
                    activityStatusListValue.Clear();

                    //ActivityEvents list received contain all events for activities in orders in event order
                    //Walking down-up on the ActivityEvents list and keeping the last entry

                    for (int index = sqlTrackingWorkflowInstance.ActivityEvents.Count; index >= 1; index--)
                    {
                        ActivityTrackingRecord activityTrackingRecord = sqlTrackingWorkflowInstance.ActivityEvents[index - 1];
                        if (!activityStatusListValue.ContainsKey(activityTrackingRecord.QualifiedName))
                        {
                            ActivityStatusInfo latestActivityStatus = new ActivityStatusInfo(activityTrackingRecord.QualifiedName, activityTrackingRecord.ExecutionStatus.ToString());
                            activityStatusListValue.Add(activityTrackingRecord.QualifiedName, latestActivityStatus);

                            string[] activitiesListViewItems = new string[] {
                                activityTrackingRecord.EventOrder.ToString(),
                                     activityTrackingRecord.QualifiedName,
                                     activityTrackingRecord.ExecutionStatus.ToString()
                            };
                            ListViewItem li = new ListViewItem(activitiesListViewItems, -1);
                            listViewActivities.Items.Add(li);
                        }
                    }
                    workflowViewHost.Refresh();
                }
            }
        }
示例#6
0
        //Get the workflow definition from the database and load viewhost
        private void GetWorkflowDefinition(Guid workflowInstanceId)
        {
            SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance = null;

            if (true == monitorDatabaseServiceValue.TryGetWorkflow(workflowInstanceId, out sqlTrackingWorkflowInstance))
            {
                if ((null != sqlTrackingWorkflowInstance) && (null != sqlTrackingWorkflowInstance.WorkflowDefinition))
                {
                    Activity workflowDefinition = sqlTrackingWorkflowInstance.WorkflowDefinition;
                    if (null != workflowDefinition)
                    {
                        workflowViewHost.OpenWorkflow(workflowDefinition);
                    }
                }
            }
            else
            {
                throw (new Exception());
            }
        }
示例#7
0
        internal bool TryGetWorkflow(Guid workflowInstanceId, out SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance)
        {
            SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString);

            return(sqlTrackingQuery.TryGetWorkflow(workflowInstanceId, out sqlTrackingWorkflowInstance));
        }
示例#8
0
        private void DisplayWorkflows(string selectedWorkflowEvent, Guid workflowInstanceId, DateTime statusFrom, DateTime statusUntil, TrackingDataItemValue trackingDataItemValue)
        {
            //Try to get all of the workflows from the tracking database
            try
            {
                if ((null != workflowInstanceId) && (Guid.Empty != workflowInstanceId))
                {
                    displayedWorkflows.Clear();
                    SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance = null;
                    if (true == monitorDatabaseServiceValue.TryGetWorkflow(workflowInstanceId, out sqlTrackingWorkflowInstance))
                    {
                        displayedWorkflows.Add(sqlTrackingWorkflowInstance);
                    }
                }
                else
                {
                    displayedWorkflows = monitorDatabaseServiceValue.GetWorkflows(selectedWorkflowEvent, statusFrom, statusUntil, trackingDataItemValue);
                }
                listViewWorkflows.Items.Clear();
                workflowStatusList.Clear();

                // For every workflow instance create a new WorkflowStatusInfo object and store in the workflowStatusList
                // Also populate the workflow ListView
                foreach (SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance in displayedWorkflows)
                {
                    string       workflowType = (sqlTrackingWorkflowInstance.WorkflowType != null) ? sqlTrackingWorkflowInstance.WorkflowType.ToString() : "XAML";
                    ListViewItem listViewItem = new ListViewItem(new string[] {
                        sqlTrackingWorkflowInstance.WorkflowInstanceInternalId.ToString(),
                        workflowType,
                        sqlTrackingWorkflowInstance.Status.ToString()
                    }, -1);

                    listViewWorkflows.Items.Add(listViewItem);

                    workflowStatusList.Add(sqlTrackingWorkflowInstance.WorkflowInstanceInternalId.ToString(),
                                           new WorkflowStatusInfo(
                                               sqlTrackingWorkflowInstance.WorkflowInstanceInternalId.ToString(),
                                               workflowType,
                                               sqlTrackingWorkflowInstance.Status.ToString(),
                                               sqlTrackingWorkflowInstance.Initialized.ToString(),
                                               sqlTrackingWorkflowInstance.WorkflowInstanceId,
                                               listViewItem));
                }

                //If there is at least one workflow, populate the Activities list
                if (listViewWorkflows.Items.Count > 0)
                {
                    this.listViewWorkflows.Focus();
                    ListViewItem listItem = this.listViewWorkflows.Items[0];
                    listItem.Focused  = true;
                    listItem.Selected = true;
                    UpdateTitle();
                    UpdateActivities();
                    this.statusLabelMonitoring.Text = String.Empty;
                }

                //Display number of workflow instances
                if (displayedWorkflows.Count > 0)
                {
                    this.workflowsLabel.Text = " Workflows - " + displayedWorkflows.Count + " records";
                    ShowViewHost(true);
                }
                else
                {
                    this.workflowsLabel.Text = " Workflows - no records";
                    ShowViewHost(false);
                }
            }
            //Clear all of the lists and reset the UI if there are errors
            catch (Exception e)
            {
                if (e.InnerException != null)
                {
                    MessageBox.Show(e.Message + "\r\n" + e.InnerException.Message + "\r\n" + "Ensure your settings are correct and that you have run SqlTrackingService database schema and logic scripts", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                this.statusLabelMonitoring.Text = "Error";
                ShowSettingsDialog();

                workflowStatusList.Clear();
                listViewWorkflows.Items.Clear();

                activityStatusListValue.Clear();
                listViewActivities.Items.Clear();

                this.workflowsLabel.Text = " Workflows - no records";
                ShowViewHost(false);
            }
        }