1
0
协褏 褋褍褉胁邪谢卸懈泄谐 褏邪褉邪褏

闃舵2: ViewC/D鎺ュ叆鐪熷疄鏈嶅姟 + 涓婚璇█鍋忓ソ鎸佷箙鍖

纾 鏇 6 萤写萤褉 萤屑薪萤
parent
commit
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");