using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.Logging;
using OrpaonVision.Core.Results;
using OrpaonVision.Model.Training;
using OrpaonVision.ConfigApp.Infrastructure.Services;
using System.Collections.ObjectModel;
using System.Windows.Threading;
namespace OrpaonVision.ConfigApp.ViewModels;
///
/// 训练任务管理视图模型。
///
public partial class TrainingTaskManagementViewModel : ObservableObject
{
private readonly ILogger _logger;
private readonly ITrainingTaskService _trainingTaskService;
private readonly DispatcherTimer _refreshTimer;
[ObservableProperty]
private ObservableCollection _tasks = new();
[ObservableProperty]
private TrainingTaskModel? _selectedTask;
[ObservableProperty]
private TrainingTaskStatus? _selectedStatus;
[ObservableProperty]
private string _searchKeyword = string.Empty;
[ObservableProperty]
private int _currentPageIndex = 1;
[ObservableProperty]
private int _pageSize = 20;
[ObservableProperty]
private int _totalCount;
[ObservableProperty]
private int _totalPages;
[ObservableProperty]
private bool _isLoading;
[ObservableProperty]
private bool _isRefreshing;
[ObservableProperty]
private TrainingTaskStatistics _statistics = new();
[ObservableProperty]
private string _statusMessage = string.Empty;
///
/// 构造函数。
///
public TrainingTaskManagementViewModel(
ILogger logger,
ITrainingTaskService trainingTaskService)
{
_logger = logger;
_trainingTaskService = trainingTaskService;
// 初始化刷新定时器
_refreshTimer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(30) // 30秒刷新一次
};
_refreshTimer.Tick += async (sender, e) => await RefreshDataAsync();
// 初始化状态选项
StatusOptions = new ObservableCollection
{
null, // 全部
TrainingTaskStatus.Draft,
TrainingTaskStatus.Pending,
TrainingTaskStatus.Running,
TrainingTaskStatus.Paused,
TrainingTaskStatus.Completed,
TrainingTaskStatus.Failed,
TrainingTaskStatus.Cancelled
};
// 加载数据
_ = Task.Run(async () => await LoadDataAsync());
}
///
/// 状态选项。
///
public ObservableCollection StatusOptions { get; }
///
/// 是否有选中的任务。
///
public bool HasSelectedTask => SelectedTask != null;
///
/// 选中任务是否可以启动。
///
public bool CanStartTask => SelectedTask != null &&
(SelectedTask.Status == TrainingTaskStatus.Pending || SelectedTask.Status == TrainingTaskStatus.Paused);
///
/// 选中任务是否可以暂停。
///
public bool CanPauseTask => SelectedTask != null && SelectedTask.Status == TrainingTaskStatus.Running;
///
/// 选中任务是否可以停止。
///
public bool CanStopTask => SelectedTask != null &&
(SelectedTask.Status == TrainingTaskStatus.Running || SelectedTask.Status == TrainingTaskStatus.Paused);
///
/// 选中任务是否可以取消。
///
public bool CanCancelTask => SelectedTask != null &&
SelectedTask.Status != TrainingTaskStatus.Completed &&
SelectedTask.Status != TrainingTaskStatus.Cancelled;
///
/// 选中任务是否可以重新启动。
///
public bool CanRestartTask => SelectedTask != null &&
(SelectedTask.Status == TrainingTaskStatus.Failed || SelectedTask.Status == TrainingTaskStatus.Cancelled);
///
/// 选中任务是否可以删除。
///
public bool CanDeleteTask => SelectedTask != null && SelectedTask.Status != TrainingTaskStatus.Running;
///
/// 刷新数据命令。
///
[RelayCommand]
private async Task RefreshDataAsync()
{
if (IsRefreshing) return;
try
{
IsRefreshing = true;
StatusMessage = "正在刷新数据...";
await LoadDataAsync();
await LoadStatisticsAsync();
StatusMessage = $"数据已更新 - {DateTime.Now:HH:mm:ss}";
}
catch (Exception ex)
{
_logger.LogError(ex, "刷新数据失败");
StatusMessage = "刷新数据失败";
}
finally
{
IsRefreshing = false;
}
}
///
/// 搜索命令。
///
[RelayCommand]
public async Task SearchAsync()
{
CurrentPageIndex = 1;
await LoadTasksAsync();
}
///
/// 页面变化命令。
///
[RelayCommand]
private async Task PageChangedAsync(int pageIndex)
{
CurrentPageIndex = pageIndex;
await LoadTasksAsync();
}
///
/// 启动任务命令。
///
[RelayCommand]
private async Task StartTaskAsync()
{
if (SelectedTask == null) return;
try
{
IsLoading = true;
StatusMessage = "正在启动任务...";
var result = await _trainingTaskService.StartTask(SelectedTask.Id, "当前用户");
if (result.Succeeded)
{
StatusMessage = "任务启动成功";
await LoadTasksAsync();
await LoadStatisticsAsync();
}
else
{
StatusMessage = $"任务启动失败: {result.Message}";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "启动任务失败");
StatusMessage = "任务启动失败";
}
finally
{
IsLoading = false;
}
}
///
/// 暂停任务命令。
///
[RelayCommand]
private async Task PauseTaskAsync()
{
if (SelectedTask == null) return;
try
{
IsLoading = true;
StatusMessage = "正在暂停任务...";
var result = await _trainingTaskService.PauseTask(SelectedTask.Id, "当前用户");
if (result.Succeeded)
{
StatusMessage = "任务暂停成功";
await LoadTasksAsync();
await LoadStatisticsAsync();
}
else
{
StatusMessage = $"任务暂停失败: {result.Message}";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "暂停任务失败");
StatusMessage = "任务暂停失败";
}
finally
{
IsLoading = false;
}
}
///
/// 停止任务命令。
///
[RelayCommand]
private async Task StopTaskAsync()
{
if (SelectedTask == null) return;
try
{
IsLoading = true;
StatusMessage = "正在停止任务...";
var result = await _trainingTaskService.StopTask(SelectedTask.Id, "当前用户");
if (result.Succeeded)
{
StatusMessage = "任务停止成功";
await LoadTasksAsync();
await LoadStatisticsAsync();
}
else
{
StatusMessage = $"任务停止失败: {result.Message}";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "停止任务失败");
StatusMessage = "任务停止失败";
}
finally
{
IsLoading = false;
}
}
///
/// 取消任务命令。
///
[RelayCommand]
private async Task CancelTaskAsync()
{
if (SelectedTask == null) return;
try
{
IsLoading = true;
StatusMessage = "正在取消任务...";
var result = await _trainingTaskService.CancelTask(SelectedTask.Id, "当前用户");
if (result.Succeeded)
{
StatusMessage = "任务取消成功";
await LoadTasksAsync();
await LoadStatisticsAsync();
}
else
{
StatusMessage = $"任务取消失败: {result.Message}";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "取消任务失败");
StatusMessage = "任务取消失败";
}
finally
{
IsLoading = false;
}
}
///
/// 重新启动任务命令。
///
[RelayCommand]
private async Task RestartTaskAsync()
{
if (SelectedTask == null) return;
try
{
IsLoading = true;
StatusMessage = "正在重新启动任务...";
var result = await _trainingTaskService.RestartTask(SelectedTask.Id, "当前用户");
if (result.Succeeded)
{
StatusMessage = "任务重新启动成功";
await LoadTasksAsync();
await LoadStatisticsAsync();
}
else
{
StatusMessage = $"任务重新启动失败: {result.Message}";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "重新启动任务失败");
StatusMessage = "任务重新启动失败";
}
finally
{
IsLoading = false;
}
}
///
/// 删除任务命令。
///
[RelayCommand]
private async Task DeleteTaskAsync()
{
if (SelectedTask == null) return;
try
{
IsLoading = true;
StatusMessage = "正在删除任务...";
var result = await _trainingTaskService.DeleteTask(SelectedTask.Id);
if (result.Succeeded)
{
StatusMessage = "任务删除成功";
SelectedTask = null;
await LoadTasksAsync();
await LoadStatisticsAsync();
}
else
{
StatusMessage = $"任务删除失败: {result.Message}";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "删除任务失败");
StatusMessage = "任务删除失败";
}
finally
{
IsLoading = false;
}
}
///
/// 查看任务详情命令。
///
[RelayCommand]
private async Task ViewTaskDetailsAsync()
{
if (SelectedTask == null) return;
// TODO: 实现查看任务详情功能
StatusMessage = $"查看任务详情: {SelectedTask.Name}";
}
///
/// 加载数据。
///
private async Task LoadDataAsync()
{
await Task.WhenAll(LoadTasksAsync(), LoadStatisticsAsync());
}
///
/// 加载任务列表。
///
private async Task LoadTasksAsync()
{
try
{
var result = await _trainingTaskService.GetTaskPagedList(
CurrentPageIndex,
PageSize,
SelectedStatus,
string.IsNullOrWhiteSpace(SearchKeyword) ? null : SearchKeyword);
if (result.Succeeded)
{
var tasks = result.Data.Items.ToList();
await System.Windows.Application.Current.Dispatcher.InvokeAsync(() =>
{
Tasks.Clear();
foreach (var task in tasks)
{
Tasks.Add(task);
}
TotalCount = result.Data.TotalCount;
TotalPages = result.Data.TotalPages;
});
}
else
{
_logger.LogError("加载任务列表失败: {Message}", result.Message);
StatusMessage = "加载任务列表失败";
}
}
catch (Exception ex)
{
_logger.LogError(ex, "加载任务列表异常");
StatusMessage = "加载任务列表异常";
}
}
///
/// 加载统计信息。
///
private async Task LoadStatisticsAsync()
{
try
{
var result = await _trainingTaskService.GetTaskStatistics();
if (result.Succeeded)
{
Statistics = result.Data;
}
else
{
_logger.LogError("加载统计信息失败: {Message}", result.Message);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "加载统计信息异常");
}
}
///
/// 选中任务变化时更新命令状态。
///
partial void OnSelectedTaskChanged(TrainingTaskModel? value)
{
OnPropertyChanged(nameof(HasSelectedTask));
OnPropertyChanged(nameof(CanStartTask));
OnPropertyChanged(nameof(CanPauseTask));
OnPropertyChanged(nameof(CanStopTask));
OnPropertyChanged(nameof(CanCancelTask));
OnPropertyChanged(nameof(CanRestartTask));
OnPropertyChanged(nameof(CanDeleteTask));
}
///
/// 启动自动刷新。
///
public void StartAutoRefresh()
{
_refreshTimer.Start();
}
///
/// 停止自动刷新。
///
public void StopAutoRefresh()
{
_refreshTimer.Stop();
}
///
/// 释放资源。
///
public void Dispose()
{
_refreshTimer?.Stop();
_refreshTimer?.Stop();
}
}