using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PMSWPF.Data.Repositories; using PMSWPF.Enums; using PMSWPF.Helper; using PMSWPF.Message; using PMSWPF.Models; using PMSWPF.ViewModels; using SqlSugar; namespace PMSWPF.Services; /// /// 数据服务类,负责从数据库加载和管理各种数据,并提供数据变更通知。 /// 继承自ObservableRecipient,可以接收消息;实现IRecipient,处理加载消息。 /// public partial class DataServices : ObservableRecipient, IRecipient { // 日志记录器,用于记录数据服务中的操作和错误。 private readonly ILogger _logger; // 设备列表,使用ObservableProperty特性,当值改变时会自动触发属性变更通知。 [ObservableProperty] private List _devices; // 变量表列表。 [ObservableProperty] private List _variableTables; // 变量数据列表。 [ObservableProperty] private List _variableDatas; // 菜单树列表。 [ObservableProperty] private List menuTrees; // MQTT配置列表。 [ObservableProperty] private List _mqtts; // 设备数据仓库,用于设备数据的CRUD操作。 private readonly DeviceRepository _deviceRepository; // 菜单数据仓库,用于菜单数据的CRUD操作。 private readonly MenuRepository _menuRepository; // MQTT数据仓库,用于MQTT配置数据的CRUD操作。 private readonly MqttRepository _mqttRepository; // 变量数据仓库,用于变量数据的CRUD操作。 private readonly VarDataRepository _varDataRepository; // 设备列表变更事件,当设备列表数据更新时触发。 public event EventHandler> OnDeviceListChanged; // 菜单树列表变更事件,当菜单树数据更新时触发。 public event EventHandler> OnMenuTreeListChanged; // MQTT列表变更事件,当MQTT配置数据更新时触发。 public event EventHandler> OnMqttListChanged; // 变量数据变更事件,当变量数据更新时触发。 public event EventHandler> OnVariableDataChanged; /// /// 当_devices属性值改变时触发的局部方法,用于调用OnDeviceListChanged事件。 /// /// 新的设备列表。 partial void OnDevicesChanged(List devices) { OnDeviceListChanged?.Invoke(this, devices); } /// /// 当menuTrees属性值改变时触发的局部方法,用于调用OnMenuTreeListChanged事件。 /// /// 新的菜单树列表。 partial void OnMenuTreesChanged(List MenuTrees) { OnMenuTreeListChanged?.Invoke(this, MenuTrees); } /// /// 当_mqtts属性值改变时触发的局部方法,用于调用OnMqttListChanged事件。 /// /// 新的MQTT配置列表。 partial void OnMqttsChanged(List mqtts) { OnMqttListChanged?.Invoke(this, mqtts); } // 注释掉的代码块,可能用于变量数据变更事件的触发,但目前未启用。 // { // OnVariableDataChanged?.Invoke(this, value); // } /// /// DataServices类的构造函数。 /// 注入ILogger,并初始化各个数据仓库。 /// /// 日志记录器实例。 public DataServices(ILogger logger) { _logger = logger; IsActive = true; // 激活消息接收器 _deviceRepository = new DeviceRepository(); _menuRepository = new MenuRepository(); _mqttRepository = new MqttRepository(); _varDataRepository = new VarDataRepository(); } /// /// 接收加载消息,根据消息类型从数据库加载对应的数据。 /// /// 加载消息,包含要加载的数据类型。 /// 如果加载类型未知,可能会抛出此异常(尽管当前实现中未显式抛出)。 public async void Receive(LoadMessage message) { try { switch (message.LoadType) { case LoadTypes.All: // 加载所有数据 await LoadDevices(); await LoadMenus(); await LoadMqtts(); await LoadVariableDatas(); break; case LoadTypes.Devices: // 仅加载设备数据 await LoadDevices(); break; case LoadTypes.Menu: // 仅加载菜单数据 await LoadMenus(); break; case LoadTypes.Mqtts: // 仅加载MQTT配置数据 await LoadMqtts(); break; } } catch (Exception e) { // 捕获加载数据时发生的异常,并通过通知和日志记录错误信息。 NotificationHelper.ShowError($"加载数据出现了错误:{e.Message}", e); } } /// /// 异步加载设备数据。 /// /// 表示异步操作的任务。 private async Task LoadDevices() { Devices = await _deviceRepository.GetAll(); } /// /// 异步加载菜单数据,并进行父级关联和排序。 /// /// 表示异步操作的任务。 private async Task LoadMenus() { MenuTrees = await _menuRepository.GetMenuTrees(); foreach (MenuBean menu in MenuTrees) { MenuHelper.MenuAddParent(menu); // 为菜单添加父级引用 DataServicesHelper.SortMenus(menu); // 排序菜单 } } /// /// 异步获取所有MQTT配置。 /// /// 包含所有MQTT配置的列表。 public async Task> GetMqttsAsync() { return await _mqttRepository.GetAll(); } /// /// 异步加载MQTT配置数据。 /// /// 表示异步操作的任务。 private async Task LoadMqtts() { Mqtts = await _mqttRepository.GetAll(); } /// /// 异步获取所有变量数据。 /// /// 包含所有变量数据的列表。 public async Task> GetAllVariableDataAsync() { return await _varDataRepository.GetAllAsync(); } /// /// 异步加载变量数据。 /// /// 表示异步操作的任务。 private async Task LoadVariableDatas() { VariableDatas = await _varDataRepository.GetAllAsync(); } }