using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using LiveChartsCore; using LiveChartsCore.SkiaSharpView; using Microsoft.Extensions.Logging; using WCTDataMiner.Core.Services; using WCTDataMiner.Wpf.Messages; namespace WCTDataMiner.Wpf.ViewModels; /// /// Qfod 折线图 ViewModel /// public partial class QfodChartViewModel : ObservableObject { private readonly ScenarioService _scenarioService; private readonly ILogger _logger; [ObservableProperty] private Guid _scenarioId; [ObservableProperty] private ISeries[] _series; [ObservableProperty] private Axis[] _xAxes; [ObservableProperty] private Axis[] _yAxes; [ObservableProperty] private bool _isLoading; [ObservableProperty] private string _loadingMessage = ""; public QfodChartViewModel( ScenarioService scenarioService, ILogger logger) { _scenarioService = scenarioService; _logger = logger; // 初始化图表配置 Series = Array.Empty(); XAxes = new Axis[] { new Axis { Name = "Coil Index" } }; YAxes = new Axis[] { new Axis { Name = "Q Value" } }; } /// /// ScenarioId 属性变更时自动触发数据加载 /// partial void OnScenarioIdChanged(Guid value) { if (value != Guid.Empty) { _ = LoadDataAsync().ContinueWith(t => { if (t.Exception != null) { _logger.LogError(t.Exception, "LoadDataAsync 失败: ScenarioId={ScenarioId}", value); } }, TaskContinuationOptions.OnlyOnFaulted); } } [RelayCommand] private void SwitchToTable() { WeakReferenceMessenger.Default.Send(new NavigateToQfodTableMessage(ScenarioId)); } public async Task LoadDataAsync() { if (IsLoading) return; // 防并发 IsLoading = true; LoadingMessage = "正在加载数据..."; try { var records = await _scenarioService.GetQfodRecordsByScenarioIdAsync(ScenarioId); if (records.Count == 0) { Series = Array.Empty(); _logger.LogWarning("未找到 Qfod 数据: ScenarioId={ScenarioId}", ScenarioId); LoadingMessage = "无数据"; return; } // 构建 DeltaQ、CurrentQ、RawQ 三条曲线 var deltaQValues = records.Select(r => (double)r.DeltaQ).ToArray(); var currentQValues = records.Select(r => (double)r.CurrentQ).ToArray(); var rawQValues = records.Select(r => (double)r.RawQ).ToArray(); var coilLabels = records.Select(r => $"{r.ChargerIndex}-{r.CoilIndex}").ToArray(); Series = new ISeries[] { new LineSeries { Name = "DeltaQ", Values = deltaQValues, GeometrySize = 5 }, new LineSeries { Name = "CurrentQ", Values = currentQValues, GeometrySize = 5 }, new LineSeries { Name = "RawQ", Values = rawQValues, GeometrySize = 5 } }; // 更新 X 轴标签 XAxes = new Axis[] { new Axis { Name = "Charger-Coil Index", Labels = coilLabels } }; _logger.LogInformation("加载 Qfod 图表数据成功: ScenarioId={ScenarioId}, 记录数={Count}", ScenarioId, records.Count); LoadingMessage = ""; } catch (Exception ex) { _logger.LogError(ex, "加载 Qfod 图表数据失败: ScenarioId={ScenarioId}", ScenarioId); LoadingMessage = $"加载失败: {ex.Message}"; } finally { IsLoading = false; } } }