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; private List _allJobRuns; #region Properties private ObservableCollection _jobRuns; public ObservableCollection JobRuns { get { return _jobRuns; } set { _jobRuns = value; RaisePropertyChangedAuto(); } } private JobRunModel _selectedJobRun = null; public JobRunModel SelectedJobRun { get { return _selectedJobRun; } set { _selectedJobRun = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _selectedMachines; public SelectedObjectCollection SelectedMachines { get { return _selectedMachines; } set { _selectedMachines = value; RaisePropertyChangedAuto(); } } private DateTime _startSelectedDate; public DateTime StartSelectedDate { get { return _startSelectedDate; } set { _startSelectedDate = value; RaisePropertyChangedAuto(); } } private DateTime _endSelectedDate; public DateTime EndSelectedDate { get { return _endSelectedDate; } set { _endSelectedDate = value; RaisePropertyChangedAuto(); } } protected Double _lengthLowerValue; public Double LengthLowerValue { get { return _lengthLowerValue; } set { _lengthLowerValue = value; RaisePropertyChangedAuto(); } } protected Double _lengthUpperValue; public Double LengthUpperValue { get { return _lengthUpperValue; } set { _lengthUpperValue = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _jobRunSelectedSources; public SelectedObjectCollection JobRunSelectedSources { get { return _jobRunSelectedSources; } set { _jobRunSelectedSources = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _jobRunSelectedStatuses; public SelectedObjectCollection JobRunSelectedStatuses { get { return _jobRunSelectedStatuses; } set { _jobRunSelectedStatuses = value; RaisePropertyChangedAuto(); } } public SelectedObjectCollection _isGradientSelection; public SelectedObjectCollection IsGradientSelection { get { return _isGradientSelection; } set { _isGradientSelection = value; RaisePropertyChangedAuto(); } } private SelectedObjectCollection _selectedThreads; public SelectedObjectCollection SelectedThreads { get { return _selectedThreads; } set { _selectedThreads = value; RaisePropertyChangedAuto(); } } /// /// Gets or sets the JobRuns providers. /// public ISuggestionProvider JobRunsProvider { get; set; } private JobRun _jobRun; public JobRun JobRun { get { return _jobRun; } set { _jobRun = value; if (_jobRun != null) { SelectedJobName = _jobRun.JobName; } RaisePropertyChangedAuto(); } } private string SelectedJobName { get; set; } #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)); JobRunsProvider = new SuggestionProvider((filter) => { try { SelectedJobName = filter; return _allJobRuns.Where(x => x.JobName != null && x.JobName.ToString().StartsWith(filter, StringComparison.CurrentCultureIgnoreCase)).ToList(); } catch { return null; } }); } public async void Init() { using (_notification.PushTaskItem("Loading job runs...")) { try { IsFree = false; using (var db = ObservablesContext.CreateDefault()) { _allJobRuns = await db.JobRuns.ToListAsync(); ; _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; } } } 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; 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) .Query(y => y.Where(x => (String.IsNullOrEmpty(SelectedJobName) || x.JobName.ToString().ToLower().StartsWith(SelectedJobName.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; } } } } }