浏览代码

阶段2: ViewC/D接入真实服务 + 主题语言偏好持久化

磊 曹 3 月之前
父节点
当前提交
8a2cd521ed

+ 7 - 1
src/YZWater.Avalonia/App.axaml.cs

@@ -41,7 +41,13 @@ public partial class App : Application
         // 初始化服务
         DatabaseService.Initialize();
         PlcService.Initialize();
-        ThemeHelper.SetTheme(false);
+
+        // 加载主题和语言偏好
+        ThemeService.Instance.LoadFromConfig();
+        LanguageService.Instance.LoadFromConfig();
+
+        // 应用当前主题
+        ThemeHelper.SetTheme(ThemeService.Instance.IsDarkTheme);
 
         // 初始化轮询和报警服务
         PlcPollingService.Instance.Start();

+ 12 - 0
src/YZWater.Core/Models/SystemConfig.cs

@@ -72,4 +72,16 @@ public partial class SystemConfig : ObservableObject
     /// </summary>
     [ObservableProperty]
     private string _contactPhone = "18115099090";
+
+    /// <summary>
+    /// 是否深色主题
+    /// </summary>
+    [ObservableProperty]
+    private bool _isDarkTheme;
+
+    /// <summary>
+    /// 是否中文语言
+    /// </summary>
+    [ObservableProperty]
+    private bool _isChinese = true;
 }

+ 24 - 1
src/YZWater.Core/Services/LanguageService.cs

@@ -21,14 +21,37 @@ public partial class LanguageService : ObservableObject
     private LanguageService() { }
 
     /// <summary>
-    /// 切换语言
+    /// 从配置加载语言偏好
+    /// </summary>
+    public void LoadFromConfig()
+    {
+        var config = ConfigService.GetConfig();
+        if (config != null)
+        {
+            IsChinese = config.IsChinese;
+        }
+    }
+
+    /// <summary>
+    /// 切换语言并保存
     /// </summary>
     public void ToggleLanguage()
     {
         IsChinese = !IsChinese;
+        SaveToConfig();
         LanguageChanged?.Invoke();
     }
 
+    private void SaveToConfig()
+    {
+        var config = ConfigService.GetConfig();
+        if (config != null)
+        {
+            config.IsChinese = IsChinese;
+            ConfigService.SaveConfig();
+        }
+    }
+
     /// <summary>
     /// 获取翻译
     /// </summary>

+ 25 - 6
src/YZWater.Core/Services/ThemeService.cs

@@ -3,7 +3,7 @@ using CommunityToolkit.Mvvm.ComponentModel;
 namespace YZWater.Core.Services;
 
 /// <summary>
-/// 主题切换服务(纯状态管理,不依赖 Avalonia)
+/// 主题切换服务
 /// </summary>
 public partial class ThemeService : ObservableObject
 {
@@ -13,20 +13,39 @@ public partial class ThemeService : ObservableObject
     [ObservableProperty]
     private bool _isDarkTheme = false;
 
-    /// <summary>
-    /// 主题变更事件(由 App.axaml.cs 订阅执行实际切换)
-    /// </summary>
     public event Action? ThemeChanged;
 
     private ThemeService() { }
 
     /// <summary>
-    /// 切换主题
+    /// 从配置加载主题偏好
+    /// </summary>
+    public void LoadFromConfig()
+    {
+        var config = ConfigService.GetConfig();
+        if (config != null)
+        {
+            IsDarkTheme = config.IsDarkTheme;
+        }
+    }
+
+    /// <summary>
+    /// 切换主题并保存
     /// </summary>
     public void ToggleTheme()
     {
         IsDarkTheme = !IsDarkTheme;
-        Console.WriteLine($"[ThemeService] ToggleTheme: IsDarkTheme={IsDarkTheme}");
+        SaveToConfig();
         ThemeChanged?.Invoke();
     }
+
+    private void SaveToConfig()
+    {
+        var config = ConfigService.GetConfig();
+        if (config != null)
+        {
+            config.IsDarkTheme = IsDarkTheme;
+            ConfigService.SaveConfig();
+        }
+    }
 }

+ 50 - 0
src/YZWater.Core/ViewModels/ViewCViewModel.cs

@@ -54,9 +54,59 @@ public partial class ViewCViewModel : ObservableObject
         UpdateTexts();
         _lang.LanguageChanged += UpdateTexts;
         InitializeChart();
+
+        // 订阅 PLC 轮询数据
+        PlcPollingService.Instance.DataUpdated += OnDataUpdated;
+
         _ = LoadFlowRecordsAsync();
     }
 
+    /// <summary>
+    /// PLC 数据更新回调 - 记录流量数据
+    /// </summary>
+    private void OnDataUpdated(PlcDataModel data)
+    {
+        // 将当前流量数据添加到图表
+        AddDataPoint(data);
+    }
+
+    private void AddDataPoint(PlcDataModel data)
+    {
+        try
+        {
+            var now = DateTime.Now;
+
+            // 更新进水流量图表
+            if (InflowSeries?.Length > 0 && InflowSeries[0] is ColumnSeries<DateTimePoint> inflowSeries)
+            {
+                var values = inflowSeries.Values?.ToList() ?? new List<DateTimePoint>();
+                values.Add(new DateTimePoint(now, data.InflowRate));
+
+                // 保留最近 60 个数据点
+                if (values.Count > 60)
+                    values.RemoveAt(0);
+
+                inflowSeries.Values = values.ToArray();
+            }
+
+            // 更新出水流量图表
+            if (OutflowSeries?.Length > 0 && OutflowSeries[0] is ColumnSeries<DateTimePoint> outflowSeries)
+            {
+                var values = outflowSeries.Values?.ToList() ?? new List<DateTimePoint>();
+                values.Add(new DateTimePoint(now, data.OutflowRate));
+
+                if (values.Count > 60)
+                    values.RemoveAt(0);
+
+                outflowSeries.Values = values.ToArray();
+            }
+        }
+        catch (Exception ex)
+        {
+            Log.Error(ex, "更新图表数据失败");
+        }
+    }
+
     private void UpdateTexts()
     {
         TitleText = _lang.Get("FlowRecords");

+ 12 - 0
src/YZWater.Core/ViewModels/ViewDViewModel.cs

@@ -64,9 +64,21 @@ public partial class ViewDViewModel : ObservableObject
     {
         UpdateTexts();
         _lang.LanguageChanged += UpdateTexts;
+
+        // 订阅报警服务
+        AlarmService.Instance.AlarmRaised += OnAlarmRaised;
+
         _ = LoadAlarmRecordsAsync();
     }
 
+    /// <summary>
+    /// 新报警触发回调
+    /// </summary>
+    private async void OnAlarmRaised(AlarmRecord alarm)
+    {
+        await LoadAlarmRecordsAsync();
+    }
+
     private void UpdateTexts()
     {
         TitleText = _lang.Get("AlarmLog");