aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ReportIssueViewVM.cs
blob: 6df5fc4bc0847386667b74df283fdc593abd93da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.UI.TFS;
using Tango.Settings;
using Tango.SharedUI;
using Tango.SharedUI.Components;
using Tango.TFS;

namespace Tango.MachineStudio.UI.ViewModels
{
    public class ReportIssueViewVM : DialogViewVM
    {
        private MachineStudioSettings _settings;

        public SelectedObjectCollection<Tag> SelectedTags { get; set; }

        public Project Project { get; set; }

        [WorkItemValidation]
        public WorkItem WorkItem { get; set; }

        private String _imageFile;
        public String ImageFile
        {
            get { return _imageFile; }
            set { _imageFile = value; RaisePropertyChangedAuto(); }
        }

        public RelayCommand BrowseImageCommand { get; set; }

        public ReportIssueViewVM() : base()
        {
            _settings = SettingsManager.Default.GetOrCreate<MachineStudioSettings>();
            BrowseImageCommand = new RelayCommand(BrowseImage);
        }

        public ReportIssueViewVM(Project project, WorkItem workItem) : this()
        {
            Project = project;
            WorkItem = workItem;

            var area = project.GetAreaByName(_settings.DefaultIssueReportArea);
            if (area != null)
            {
                workItem.Area = area;
            }

            var assignedTo = project.Members.FirstOrDefault(x => x.Email == _settings.DefaultIssueReportAssignTo);
            if (assignedTo != null)
            {
                workItem.AssignedTo = assignedTo;
            }

            var tags = project.Tags.Where(x => _settings.DefaultIssueReportTags.Contains(x.Name)).ToList();
            if (tags != null)
            {
                workItem.Tags = tags;
            }

            SelectedTags = new SelectedObjectCollection<Tag>(Project.Tags.ToObservableCollection(), workItem.Tags.ToObservableCollection());
        }

        private void BrowseImage()
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = "Select image file";
            dlg.Filter = "Image Files|*.jpg;*.bmp;*.png";
            if (dlg.ShowDialog().Value)
            {
                ImageFile = dlg.FileName;
            }
        }

        protected override void Accept()
        {
            if (Validate())
            {
                WorkItem.Tags = SelectedTags.SynchedSource.ToList();

                if (ImageFile != null && File.Exists(ImageFile))
                {
                    WorkItem.Attachments.Add(new Attachment()
                    {
                        Description = "User Image",
                        FilePath = ImageFile,
                        Name = Path.GetFileName(ImageFile),
                    });
                }

                try
                {
                    _settings.DefaultIssueReportArea = WorkItem.Area.Name;
                    _settings.DefaultIssueReportAssignTo = WorkItem.AssignedTo.Email;
                    _settings.DefaultIssueReportTags = WorkItem.Tags.Select(x => x.Name).ToList();
                    _settings.Save();
                }
                catch { }

                base.Accept();
            }
        }
    }
}
an class="n">_minDate = value; RaisePropertyChangedAuto(); } } private DateTime _maxDate; public DateTime MaxDate { get { return _maxDate; } set { _maxDate = value; RaisePropertyChangedAuto(); } } #endregion public ChartsViewVM(INotificationProvider notificationProvider) { _notification = notificationProvider; StartDate = DateTime.Now.AddMonths(-1); EndDate = DateTime.Now; } #region Generate Charts public async void Init() { using (_notification.PushTaskItem("Loading statistics...")) { IsFree = false; await Task.Factory.StartNew(() => { _context = ObservablesContext.CreateDefault(); _job_runs = _context.JobRuns.OrderBy(x => x.StartDate).ToList().Select(x => new JobRunStatisticsModel(x)).ToList(); foreach (var run in _job_runs) { run.LoadMachine(_context).GetAwaiter().GetResult(); } }); if (_job_runs.Count > 0) { MinDate = _job_runs.Min(x => x.StartDate); MaxDate = _job_runs.Max(x => x.StartDate); } InvokeUIOnIdle(() => { if (_loaded) { OnDateRangeChanged(); } }); _loaded = true; IsFree = true; } } private List<JobRunStatisticsModel> GetJobRunsByDateRange(DateTime startDate, DateTime endTime, JobRunStatus? status = null) { return _job_runs.Where(x => x.StartDate.ToLocalTime() >= startDate && x.StartDate.ToLocalTime() <= endTime && (status == null || x.JobRunStatus == status)).ToList(); } private List<JobRunStatisticsModel> GetJobRunsByDate(DateTime date, JobRunStatus? status = null) { return _job_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && (status == null || x.JobRunStatus == status)).ToList(); } private IEnumerable<DateTime> CreateDates(DateTime start, DateTime end) { for (DateTime date = start.Date; date.Date <= end.Date; date = date.AddDays(1)) { yield return date; } } private void GenerateTimelineJobStatusChart() { TimelineJobStatusSeries = new LabeledSeriesCollection() { Title = "Job Runs Status", ChartTitle = "Number Of Runs", LabelsTitle = "Date", SeriesColors = new List<Color>() { Colors.Green, Colors.Orange, Colors.Red, }, }; Series completed_job_runs = new ColumnSeries() { Title = "Completed", Values = new ChartValues<int>(), Fill = Brushes.Green, MinWidth = 1, }; Series aborted_job_runs = new ColumnSeries() { Title = "Aborted", Values = new ChartValues<int>(), Fill = Brushes.Orange, MinWidth = 1, }; Series failed_job_runs = new ColumnSeries() { Title = "Failed", Values = new ChartValues<int>(), Fill = Brushes.Red, MinWidth = 1, }; 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()); failed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Failed).Count()); TimelineJobStatusSeries.Labels.Add(date.ToShortDateString()); } TimelineJobStatusSeries.SeriesCollection.Add(failed_job_runs); TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs); TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs); } private void GeneratePieFailedReasonsChart() { var groups = GetJobRunsByDateRange(StartDate, EndDate, JobRunStatus.Failed).GroupBy(x => x.FailedMessage).OrderBy(x => x.Count()); List<Color> colors = new List<Color>(); int max = groups.Count() > 0 ? groups.Max(x => x.Count()) : 0; for (int i = 0; i < groups.Count(); i++) { int count = groups.ElementAt(i).Count(); double alpha = Math.Max(((double)(count) / max * 200), 20); colors.Add(Color.FromArgb((byte)alpha, 200, 0, 0)); } PieJobFailedReasons = new LabeledSeriesCollection() { Title = "Job Failure Reasons", SeriesColors = colors, }; int index = 0; foreach (var group in groups) { int count = group.Count(); var series = new PieSeries() { Title = group.First().FailedMessage, Values = new ChartValues<int>() { count }, Fill = new SolidColorBrush(colors[index++]), DataLabels = true, ToolTip = group.First().FailedMessage, }; PieJobFailedReasons.SeriesCollection.Add(series); } } private void GeneratePrintPerWeekChart() { List<JobRunStatisticsModel> 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.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.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); } } #endregion #region Filter by Date public void OnDateRangeChanged() { if (_job_runs != null && _job_runs.Count > 0)// && _loaded) { GenerateTimelineJobStatusChart(); GeneratePieFailedReasonsChart(); GeneratePrintPerWeekChart(); } } #endregion } }