using System.Collections; using AutoMapper; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels.Items; using Microsoft.Extensions.DependencyInjection; using ObservableCollections; using System.Linq; namespace DMS.WPF.ViewModels; partial class VariableHistoryViewModel : ViewModelBase, INavigatable { private readonly IMapper _mapper; private readonly IDialogService _dialogService; private readonly IHistoryAppService _historyAppService; private readonly IWPFDataService _wpfDataService; private readonly IDataStorageService _dataStorageService; private readonly INotificationService _notificationService; /// /// 用于过滤变量的搜索文本 /// [ObservableProperty] private string _searchText; /// /// 是否打开建议列表 /// [ObservableProperty] private bool _isSuggestionListOpen; /// /// 建议的变量列表 /// [ObservableProperty] private List _suggestedVariables; /// /// 历史记录条数限制 /// [ObservableProperty] private int? _historyLimit; /// /// 历史记录开始时间 /// [ObservableProperty] private DateTime? _startTime; /// /// 历史记录结束时间 /// [ObservableProperty] private DateTime? _endTime; /// /// 变量历史记录列表 /// public NotifyCollectionChangedSynchronizedViewList VariableHistories { get; } private readonly ObservableList _variableHistoryList; private readonly ISynchronizedView _variableHistorySynchronizedView; /// /// 所有变量的缓存列表,用于搜索 /// private List _allVariableHistories; public VariableHistoryViewModel(IMapper mapper, IDialogService dialogService, IHistoryAppService historyAppService, IWPFDataService wpfDataService, IDataStorageService dataStorageService, INotificationService notificationService) { _mapper = mapper; _dialogService = dialogService; _historyAppService = historyAppService; _wpfDataService = wpfDataService; _dataStorageService = dataStorageService; _notificationService = notificationService; _variableHistoryList = new ObservableList(); _variableHistorySynchronizedView = _variableHistoryList.CreateView(v => v); VariableHistories = _variableHistorySynchronizedView.ToNotifyCollectionChanged(); _allVariableHistories = new List(); _suggestedVariables = new List(); // 初始化默认值 _historyLimit = 1000; // 默认限制1000条记录 _startTime = null; _endTime = null; } /// /// 加载所有变量的历史记录 /// /// 返回记录的最大数量,null表示无限制 /// 开始时间,null表示无限制 /// 结束时间,null表示无限制 private async void LoadAllVariableHistories(int? limit = null, DateTime? startTime = null, DateTime? endTime = null) { try { _variableHistoryList.Clear(); var allHistories = await _historyAppService.GetAllVariableHistoriesAsync(limit, startTime, endTime); _allVariableHistories = allHistories.ToList(); _variableHistoryList.AddRange(_allVariableHistories); // 更新建议列表 UpdateSuggestedVariables(); } catch (Exception ex) { // 记录更详细的错误信息 _notificationService.ShowError($"加载变量历史记录失败: {ex.Message}", ex); } } /// /// 更新建议的变量列表 /// private void UpdateSuggestedVariables() { if (string.IsNullOrWhiteSpace(SearchText)) { // 如果搜索文本为空,显示所有唯一的变量名 _suggestedVariables = _allVariableHistories .GroupBy(h => h.VariableName) .Select(g => g.First()) .Take(10) .ToList(); } else { // 根据搜索文本过滤建议列表 _suggestedVariables = _allVariableHistories .Where(h => h.VariableName?.Contains(SearchText, StringComparison.OrdinalIgnoreCase) == true) .GroupBy(h => h.VariableName) .Select(g => g.First()) .Take(10) .ToList(); } } /// /// 搜索变量历史记录 /// /// partial void OnSearchTextChanged(string value) { // 更新建议列表 UpdateSuggestedVariables(); if (string.IsNullOrWhiteSpace(SearchText)) { // 如果搜索文本为空,显示所有历史记录 _variableHistoryList.Clear(); _variableHistoryList.AddRange(_allVariableHistories); } else { // 根据搜索文本过滤历史记录 var filteredHistories = _allVariableHistories .Where(h => h.VariableName?.Contains( SearchText, StringComparison.OrdinalIgnoreCase) == true) .ToList(); _variableHistoryList.Clear(); _variableHistoryList.AddRange(filteredHistories); } } public async Task OnNavigatedToAsync(MenuItemViewModel menu) { // 加载所有变量的历史记录 LoadAllVariableHistories(HistoryLimit, StartTime, EndTime); } /// /// 重新加载历史记录,使用当前设置的限制和时间范围 /// public void ReloadHistories() { LoadAllVariableHistories(HistoryLimit, StartTime, EndTime); } /// /// 根据变量ID加载历史记录 /// /// 变量ID /// 返回记录的最大数量,null表示无限制 /// 开始时间,null表示无限制 /// 结束时间,null表示无限制 public async Task LoadVariableHistoriesAsync(int variableId, int? limit = null, DateTime? startTime = null, DateTime? endTime = null) { try { _variableHistoryList.Clear(); var histories = await _historyAppService.GetVariableHistoriesAsync(variableId, limit, startTime, endTime); _variableHistoryList.AddRange(histories); // 更新建议列表 UpdateSuggestedVariables(); } catch (Exception ex) { // 记录更详细的错误信息 _notificationService.ShowError($"加载变量历史记录失败: {ex.Message}", ex); } } }