using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.BL; using Tango.BL.Builders; using Tango.BL.Entities; using Tango.BL.Enumerations; using Tango.Core.Commands; using Tango.MachineStudio.Common; using Tango.MachineStudio.Common.Notifications; using Tango.MachineStudio.Statistics.Models; using Tango.SharedUI; using Tango.SharedUI.Components; using Tango.AutoComplete.Editors; namespace Tango.MachineStudio.Statistics.ViewModels { public class JobRunsViewVM : ViewModel { private INotificationProvider _notification; private List _allMachines; private List _allUsers; private List _rmlsModels; #region Properties private ObservableCollection _jobRuns; /// /// Gets or sets the job runs. Contains filtered data of JobRunModel. /// public ObservableCollection JobRuns { get { return _jobRuns; } set { _jobRuns = value; RaisePropertyChangedAuto(); } } private JobRunModel _selectedJobRun = null; /// /// Gets or sets the JobRunModel. Binding to selected item of grid items. /// public JobRunModel SelectedJobRun { get { return _selectedJobRun; } set { _selectedJobRun = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _selectedMachines; /// /// Gets or sets the selected machines. Contains all available machines and selected machines. Binding to ComboBox Machines. /// public SelectedObjectCollection SelectedMachines { get { return _selectedMachines; } set { _selectedMachines = value; RaisePropertyChangedAuto(); } } private DateTime _startSelectedDate; /// /// Gets or sets the start selected date. /// public DateTime StartSelectedDate { get { return _startSelectedDate; } set { _startSelectedDate = value; RaisePropertyChangedAuto(); } } private DateTime _endSelectedDate; /// /// Gets or sets the end selected date. /// public DateTime EndSelectedDate { get { return _endSelectedDate; } set { _endSelectedDate = value; RaisePropertyChangedAuto(); } } protected Double _lengthLowerValue; /// /// Gets or sets the length lower value of Range Slider /// public Double LengthLowerValue { get { return _lengthLowerValue; } set { _lengthLowerValue = value; RaisePropertyChangedAuto(); } } protected Double _lengthUpperValue; /// /// Gets or sets the length upper value of Range Slider. /// public Double LengthUpperValue { get { return _lengthUpperValue; } set { _lengthUpperValue = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _jobRunSelectedSources; /// /// Gets or sets the job run selected sources. Binding to ComboBox "Source". /// public SelectedObjectCollection JobRunSelectedSources { get { return _jobRunSelectedSources; } set { _jobRunSelectedSources = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _jobRunSelectedStatuses; /// /// Gets or sets the job run selected statuses. Binding to ComboBox "Status". /// public SelectedObjectCollection JobRunSelectedStatuses { get { return _jobRunSelectedStatuses; } set { _jobRunSelectedStatuses = value; RaisePropertyChangedAuto(); } } public SelectedObjectCollection _isGradientSelection; /// /// Gets or sets the is gradient selection. Binding to ComboBox "IsGradient". /// public SelectedObjectCollection IsGradientSelection { get { return _isGradientSelection; } set { _isGradientSelection = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _selectedThreads; /// /// Gets or sets the selected threads. Contains all available threads and selected threads. Binding to ComboBox "Thread". /// public SelectedObjectCollection SelectedThreads { get { return _selectedThreads; } set { _selectedThreads = value; RaisePropertyChangedAuto(); } } /// /// Gets or sets the JobRuns providers. /// public ISuggestionProvider JobsProvider { get; set; } private Job _selectedJob; /// /// Gets or sets the job. Used as Sele /// public Job SelectedJob { get { return _selectedJob; } set { _selectedJob = value; RaisePropertyChangedAuto(); } } #endregion public RelayCommand LoadJobRunsCommand { get; set; } public JobRunsViewVM(INotificationProvider notificationProvider) { _notification = notificationProvider; JobRuns = new ObservableCollection(); LoadJobRunsCommand = new RelayCommand(async () => await LoadJobRuns(), () => IsFree); LengthUpperValue = 5000.0; LengthLowerValue = 0.0; DateTime now = DateTime.Now; StartSelectedDate = now.AddMonths(-1); EndSelectedDate = now; JobRunSelectedSources = new SelectedObjectCollection(new ObservableCollection() { JobSource.Local, JobSource.Remote }, new ObservableCollection() { JobSource.Local, JobSource.Remote }); JobRunSelectedSources.SelectionChanged -= (x, y) => RaisePropertyChanged(nameof(JobRunSelectedSources)); JobRunSelectedSources.SelectionChanged += (x, y) => RaisePropertyChanged(nameof(JobRunSelectedSources)); JobRunSelectedStatuses = new SelectedObjectCollection(new ObservableCollection() { JobRunStatus.Aborted, JobRunStatus.Completed, JobRunStatus.Failed, }, new ObservableCollection() { JobRunStatus.Aborted, JobRunStatus.Completed, JobRunStatus.Failed, }); JobRunSelectedStatuses.SelectionChanged -= (x, y) => RaisePropertyChanged(nameof(JobRunSelectedStatuses)); JobRunSelectedStatuses.SelectionChanged += (x, y) => RaisePropertyChanged(nameof(JobRunSelectedStatuses)); IsGradientSelection = new SelectedObjectCollection(new ObservableCollection { true, false }, new ObservableCollection { true, false }); IsGradientSelection.SelectionChanged -= (x, y) => RaisePropertyChanged(nameof(IsGradientSelection)); IsGradientSelection.SelectionChanged += (x, y) => RaisePropertyChanged(nameof(IsGradientSelection)); JobsProvider = new SuggestionProvider((filter) => { try { if (filter != null) { using (ObservablesContext db = ObservablesContext.CreateDefault()) { return db.Jobs.Where(x => x.Name!= null && x.Name.ToLower().Contains(filter.ToLower())).ToList(); } } else { return new List(); } } catch (Exception ex) { LogManager.Log(ex, "Error loading jobs."); return null; } }); } /// /// Initializes this instance. Called form main view VM in OnApplicationReady /// public async void Init() { using (_notification.PushTaskItem("Loading job runs...")) { try { IsFree = false; using (var db = ObservablesContext.CreateDefault()) { _allMachines = await db.Machines.ToListAsync(); _allUsers = await db.Users.Include(x => x.Contact).ToListAsync(); _rmlsModels = await db.Rmls.Select(x => new RmlModel() { Name = x.Name, Guid = x.Guid }).ToListAsync(); SelectedMachines = new SelectedObjectCollection(_allMachines.ToObservableCollection(), new ObservableCollection()); SelectedThreads = new SelectedObjectCollection(_rmlsModels.ToObservableCollection(), new ObservableCollection()); } } catch (Exception ex) { LogManager.Log(ex, "Error loading job runs."); } finally { IsFree = true; } } } /// /// Loads the job runs by filters. /// private async Task LoadJobRuns() { using (_notification.PushTaskItem("Loading job runs...")) { try { IsFree = false; using (var db = ObservablesContext.CreateDefault()) { DateTime startUtc = StartSelectedDate.ToUniversalTime(); TimeSpan offsetTime = (EndSelectedDate.Date == DateTime.Now.Date) ? DateTime.Now.TimeOfDay : new TimeSpan(23, 59, 59); DateTime endUtc = EndSelectedDate.ToUniversalTime() + offsetTime; string jobName = SelectedJob == null ? "" : SelectedJob.Name; var runs = await new JobRunsCollectionBuilder(db).Set(x => x.ActualStartDate <= DbFunctions.TruncateTime(endUtc) && x.ActualStartDate >= DbFunctions.TruncateTime(startUtc.Date)) .WithMachines(SelectedMachines.SynchedSource.ToList()) .WithJobSource(JobRunSelectedSources.SynchedSource) .WithJobStatus(JobRunSelectedStatuses.SynchedSource) .WithGradient(IsGradientSelection.SynchedSource) .WithRmls(SelectedThreads.SynchedSource.Select(x => x.Guid).ToList()) .Query(y => y.Where(x => ( String.IsNullOrEmpty(jobName) || x.JobName.ToLower().StartsWith(jobName.ToLower())) && (x.JobLength < LengthUpperValue && x.JobLength >= LengthLowerValue))) .BuildListAsync(); var modelList = runs.Select(x => new JobRunModel() { JobRun = x, Machine = _allMachines.FirstOrDefault(y => y.Guid == x.MachineGuid), User = _allUsers.SingleOrDefault(y => y.Guid == x.UserGuid), }).ToList(); modelList.ForEach(x => x.Init()); JobRuns = modelList.ToObservableCollection(); } } catch (Exception ex) { LogManager.Log(ex, "Error loading job runs."); } finally { IsFree = true; } } } } }