aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2019-04-17 15:20:13 +0300
committerRoy Ben-Shabat <Roy@Twine-s.com>2019-04-17 15:20:13 +0300
commit4b389560cf068961d2f09c91106f46e35bb8cb40 (patch)
tree3888601b7c4982c3d682c3237346d9a0f4f42dc3 /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
parent028e41fc21fecee05c8db707382db586b26e6537 (diff)
downloadTango-4b389560cf068961d2f09c91106f46e35bb8cb40.tar.gz
Tango-4b389560cf068961d2f09c91106f46e35bb8cb40.zip
Implemented "Thread per week" chart on statistics module.
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs237
1 files changed, 213 insertions, 24 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
index fd897e811..ef9561d0b 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs
@@ -12,6 +12,8 @@ using Tango.BL.Enumerations;
using Tango.Core.Helpers;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Statistics.Models;
+using System.Data.Entity;
+using Tango.MachineStudio.Common.Notifications;
namespace Tango.MachineStudio.Statistics.ViewModels
{
@@ -20,6 +22,8 @@ namespace Tango.MachineStudio.Statistics.ViewModels
private ObservablesContext _context;
private List<JobRun> _job_runs;
private bool rendered;
+ private INotificationProvider _notification;
+ private bool _loaded;
private LabeledSeriesCollection _timelineJobStatusSeries;
public LabeledSeriesCollection TimelineJobStatusSeries
@@ -35,24 +39,58 @@ namespace Tango.MachineStudio.Statistics.ViewModels
set { _pieJobFailedReasons = value; RaisePropertyChangedAuto(); }
}
- public MainViewVM()
+ private LabeledSeriesCollection _printPerWeekSeries;
+ public LabeledSeriesCollection PrintPerWeekSeries
{
+ get { return _printPerWeekSeries; }
+ set { _printPerWeekSeries = value; RaisePropertyChangedAuto(); }
+ }
+
+ private DateTime _startDate;
+ public DateTime StartDate
+ {
+ get { return _startDate; }
+ set { _startDate = value; RaisePropertyChangedAuto(); OnDateRangeChanged(); }
+ }
+
+ private DateTime _endDate;
+ public DateTime EndDate
+ {
+ get { return _endDate; }
+ set { _endDate = value; RaisePropertyChangedAuto(); OnDateRangeChanged(); }
+ }
+
+ private DateTime _minDate;
+ public DateTime MinDate
+ {
+ get { return _minDate; }
+ set { _minDate = value; RaisePropertyChangedAuto(); }
+ }
+
+ private DateTime _maxDate;
+ public DateTime MaxDate
+ {
+ get { return _maxDate; }
+ set { _maxDate = value; RaisePropertyChangedAuto(); }
+ }
+
+
+ public MainViewVM(INotificationProvider notificationProvider)
+ {
+ _notification = notificationProvider;
+ StartDate = DateTime.Now.AddMonths(-1);
+ EndDate = DateTime.Now;
}
public override void OnApplicationReady()
{
- Task.Factory.StartNew(() =>
- {
- _context = ObservablesContext.CreateDefault();
- DateTime start_date = DateTime.UtcNow.AddMonths(-1);
- _job_runs = _context.JobRuns.OrderBy(x => x.StartDate).ToList();
- });
+
}
- private List<JobRun> GetJobRunsByStartDate(DateTime startDate, JobRunStatus? status = null)
+ private List<JobRun> GetJobRunsByDateRange(DateTime startDate, DateTime endTime, JobRunStatus? status = null)
{
- return _job_runs.Where(x => x.StartDate.ToLocalTime() >= startDate && (status == null || x.JobRunStatus == status)).ToList();
+ return _job_runs.Where(x => x.StartDate.ToLocalTime() >= startDate && x.StartDate.ToLocalTime() <= endTime && (status == null || x.JobRunStatus == status)).ToList();
}
private List<JobRun> GetJobRunsByDate(DateTime date, JobRunStatus? status = null)
@@ -68,7 +106,9 @@ namespace Tango.MachineStudio.Statistics.ViewModels
}
}
- public override void OnNavigatedTo()
+
+
+ public override async void OnNavigatedTo()
{
base.OnNavigatedTo();
@@ -76,21 +116,49 @@ namespace Tango.MachineStudio.Statistics.ViewModels
rendered = true;
- InvokeUIOnIdle(() =>
+
+ using (_notification.PushTaskItem("Loading statistics..."))
{
+ IsFree = false;
+
+ await Task.Factory.StartNew(() =>
+ {
+ _context = ObservablesContext.CreateDefault();
+ _job_runs = _context.JobRuns.Include(x => x.Job).Include(x => x.Job.Machine).OrderBy(x => x.StartDate).ToList();
+ });
+
if (_job_runs.Count > 0)
{
- GenerateTimelineJobStatusChart();
- GeneratePieFailedReasonsChart();
+ MinDate = _job_runs.Min(x => x.StartDate);
+ MaxDate = _job_runs.Max(x => x.StartDate);
}
- });
+
+ InvokeUIOnIdle(() =>
+ {
+ OnDateRangeChanged();
+ });
+
+ _loaded = true;
+
+ IsFree = true;
+ }
+ }
+
+ private void OnDateRangeChanged()
+ {
+ if (_job_runs != null && _job_runs.Count > 0 && _loaded)
+ {
+ GenerateTimelineJobStatusChart();
+ GeneratePieFailedReasonsChart();
+ GeneratePrintPerWeekChart();
+ }
}
private void GenerateTimelineJobStatusChart()
{
TimelineJobStatusSeries = new LabeledSeriesCollection()
{
- Title = "This Month Job Runs Status",
+ Title = "Job Runs Status",
ChartTitle = "Number Of Runs",
LabelsTitle = "Date",
SeriesColors = new List<Color>()
@@ -101,26 +169,62 @@ namespace Tango.MachineStudio.Statistics.ViewModels
},
};
- var completed_job_runs = new ColumnSeries()
+ Series completed_job_runs = new ColumnSeries()
{
Title = "Completed",
Values = new ChartValues<int>(),
Fill = Brushes.Green,
+ MinWidth = 1,
+
};
- var aborted_job_runs = new ColumnSeries()
+ Series aborted_job_runs = new ColumnSeries()
{
Title = "Aborted",
Values = new ChartValues<int>(),
Fill = Brushes.Orange,
+ MinWidth = 1,
};
- var failed_job_runs = new ColumnSeries()
+ Series failed_job_runs = new ColumnSeries()
{
Title = "Failed",
Values = new ChartValues<int>(),
Fill = Brushes.Red,
+ MinWidth = 1,
};
- foreach (var date in CreateDates(DateTime.Now.AddMonths(-1), DateTime.Now))
+ if (EndDate - StartDate > TimeSpan.FromDays(40))
+ {
+ completed_job_runs = new LineSeries()
+ {
+ Title = "Completed",
+ Values = new ChartValues<int>(),
+ Fill = new SolidColorBrush(Colors.Green) { Opacity = 0.5 },
+ MinWidth = 1,
+ PointGeometry = null,
+ StrokeThickness = 0,
+
+ };
+ aborted_job_runs = new LineSeries()
+ {
+ Title = "Aborted",
+ Values = new ChartValues<int>(),
+ Fill = new SolidColorBrush(Colors.Orange) { Opacity = 0.5 },
+ MinWidth = 1,
+ PointGeometry = null,
+ StrokeThickness = 0,
+ };
+ failed_job_runs = new LineSeries()
+ {
+ Title = "Failed",
+ Values = new ChartValues<int>(),
+ Fill = new SolidColorBrush(Colors.Red) { Opacity = 0.5 },
+ MinWidth = 1,
+ PointGeometry = null,
+ StrokeThickness = 0,
+ };
+ }
+
+ foreach (var date in CreateDates(StartDate, EndDate))
{
completed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Completed).Count());
aborted_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Aborted).Count());
@@ -129,18 +233,20 @@ namespace Tango.MachineStudio.Statistics.ViewModels
TimelineJobStatusSeries.Labels.Add(date.ToShortDateString());
}
- TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs);
- TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs);
+
+
TimelineJobStatusSeries.SeriesCollection.Add(failed_job_runs);
+ TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs);
+ TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs);
}
private void GeneratePieFailedReasonsChart()
{
- var groups = GetJobRunsByStartDate(DateTime.Now.AddMonths(-1), JobRunStatus.Failed).GroupBy(x => x.FailedMessage).OrderBy(x => x.Count());
+ var groups = GetJobRunsByDateRange(StartDate, EndDate, JobRunStatus.Failed).GroupBy(x => x.FailedMessage).OrderBy(x => x.Count());
List<Color> colors = new List<Color>();
- int max = groups.Max(x => x.Count());
+ int max = groups.Count() > 0 ? groups.Max(x => x.Count()) : 0;
for (int i = 0; i < groups.Count(); i++)
{
@@ -151,7 +257,7 @@ namespace Tango.MachineStudio.Statistics.ViewModels
PieJobFailedReasons = new LabeledSeriesCollection()
{
- Title = "This Month Job Failure Reasons",
+ Title = "Job Failure Reasons",
SeriesColors = colors,
};
@@ -173,5 +279,88 @@ namespace Tango.MachineStudio.Statistics.ViewModels
PieJobFailedReasons.SeriesCollection.Add(series);
}
}
+
+ private void GeneratePrintPerWeekChart()
+ {
+ List<JobRun> range_job_runs = GetJobRunsByDateRange(StartDate, EndDate);
+
+ Dictionary<Machine, List<double>> weeks_print_avg = new Dictionary<Machine, List<double>>();
+
+ //Init machines weeks averages dictionary.
+ foreach (var machine in range_job_runs.Select(x => x.Job.Machine).OrderBy(x => x.Name).DistinctBy(x => x.Guid))
+ {
+ weeks_print_avg[machine] = new List<double>();
+ }
+
+ //Create all available dates
+ List<DateTime> all_dates = range_job_runs.Select(x => x.StartDate).ToList();
+
+ //get first Sunday.
+ DateTime current_sunday = all_dates.FirstOrDefault(x => x.DayOfWeek == DayOfWeek.Sunday);
+
+ if (current_sunday != null && all_dates.Count > 0)
+ {
+ //Iterate over each week starting from the earliest Sunday.
+ while (current_sunday <= all_dates.Last())
+ {
+ var week_job_runs = range_job_runs.Where(x => x.EndPosition > 10 && x.StartDate >= current_sunday && x.StartDate <= current_sunday.AddDays(7)).ToList();
+
+ foreach (var machine_job_runs in week_job_runs.GroupBy(x => x.Job.Machine))
+ {
+ weeks_print_avg[machine_job_runs.Key].Add(machine_job_runs.Select(x => x.EndPosition).Average());
+ }
+
+ current_sunday = current_sunday.AddDays(8);
+ }
+ }
+
+ Dictionary<Machine, double> week_print_avg = new Dictionary<Machine, double>();
+
+ //Init machines week average dictionary.
+ foreach (var machine in weeks_print_avg)
+ {
+ if (machine.Value.Count > 0)
+ {
+ week_print_avg[machine.Key] = machine.Value.Average();
+ }
+ }
+
+ //Init chart series
+ PrintPerWeekSeries = new LabeledSeriesCollection()
+ {
+ Title = "Average Printed Thread Per Week (m)",
+ ChartTitle = "Average Print Per Week (m)",
+ LabelsTitle = "Date",
+ SeriesColors = new List<Color>()
+ {
+
+ },
+ };
+
+ //Init series colors intensity by number of prints.
+ double max = week_print_avg.Count > 0 ? week_print_avg.Max(x => x.Value) : 0;
+ foreach (var machine in week_print_avg)
+ {
+ double a = (machine.Value / max);
+ PrintPerWeekSeries.SeriesColors.Add(Color.FromArgb((byte)(255d * (machine.Value / max)), 0, 200, 0));
+ }
+
+ //Init columns.
+ int index = 0;
+
+ foreach (var machine in week_print_avg)
+ {
+ var series = new ColumnSeries()
+ {
+ Title = machine.Key.Name,
+ Values = new ChartValues<int>() { (int)machine.Value },
+ Fill = new SolidColorBrush(PrintPerWeekSeries.SeriesColors[index++]),
+ DataLabels = true,
+ ToolTip = machine.Key.SerialNumber,
+ };
+
+ PrintPerWeekSeries.SeriesCollection.Add(series);
+ }
+ }
}
}