/// <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); } } }
/// <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); }
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); }
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); }
//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(); } } }
//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()); } }
internal bool TryGetWorkflow(Guid workflowInstanceId, out SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); return(sqlTrackingQuery.TryGetWorkflow(workflowInstanceId, out sqlTrackingWorkflowInstance)); }
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); } }