using System.Collections.Concurrent; using AutoMapper; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using DMS.Application.DTOs; using DMS.Core.Helper; using DMS.Core.Enums; using DMS.Core.Models; using DMS.Helper; using DMS.Message; using DMS.WPF.Helper; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace DMS.WPF.Services; /// /// 数据服务类,负责从数据库加载和管理各种数据,并提供数据变更通知。 /// 继承自ObservableRecipient,可以接收消息;实现IRecipient,处理加载消息。 /// public partial class DataServices : ObservableRecipient, IRecipient { private readonly IMapper _mapper; // 设备列表,使用ObservableProperty特性,当值改变时会自动触发属性变更通知。 [ObservableProperty] private List _devices; // 变量表列表。 [ObservableProperty] private List _variableTables; // 变量数据列表。 [ObservableProperty] private List _variables; // 菜单树列表。 [ObservableProperty] private List menuTrees; // MQTT配置列表。 // [ObservableProperty] // private List _mqtts; public ConcurrentDictionary AllVariables; // 设备数据仓库,用于设备数据的CRUD操作。 // private readonly DeviceRepository _deviceRepository; // // // 菜单数据仓库,用于菜单数据的CRUD操作。 // private readonly MenuRepository _menuRepository; // // // MQTT数据仓库,用于MQTT配置数据的CRUD操作。 // private readonly MqttRepository _mqttRepository; // // // 变量数据仓库,用于变量数据的CRUD操作。 // private readonly VarDataRepository _varDataRepository; // 设备列表变更事件,当设备列表数据更新时触发。 public event Action> OnDeviceListChanged; // 菜单树列表变更事件,当菜单树数据更新时触发。 public event Action> OnMenuTreeListChanged; // MQTT列表变更事件,当MQTT配置数据更新时触发。 // public event Action> OnMqttListChanged; // 设备IsActive状态变更事件,当单个设备的IsActive状态改变时触发。 public event Action OnDeviceIsActiveChanged; // /// // /// 当_mqtts属性值改变时触发的局部方法,用于调用OnMqttListChanged事件。 // /// // /// 新的MQTT配置列表。 // partial void OnMqttsChanged(List mqtts) // { // OnMqttListChanged?.Invoke(mqtts); // } // 注释掉的代码块,可能用于变量数据变更事件的触发,但目前未启用。 // { // OnVariableDataChanged?.Invoke(this, value); // } // /// // /// DataServices类的构造函数。 // /// 注入ILogger,并初始化各个数据仓库。 // /// // /// AutoMapper 实例。 // /// // public DataServices(IMapper mapper,DeviceRepository deviceRepository,MenuRepository menuRepository,MqttRepository mqttRepository,VarDataRepository varDataRepository) // { // _mapper = mapper; // IsActive = true; // 激活消息接收器 // // _variables = new List(); // AllVariables = new ConcurrentDictionary(); // } // /// // /// 接收加载消息,根据消息类型从数据库加载对应的数据。 // /// // /// 加载消息,包含要加载的数据类型。 // /// 如果加载类型未知,可能会抛出此异常(尽管当前实现中未显式抛出)。 // public async void Receive(LoadMessage message) // { // try // { // switch (message.LoadType) // { // case LoadTypes.All: // 加载所有数据 // await LoadDevices(); // await LoadMenus(); // await LoadMqtts(); // 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() { // 取消订阅旧设备的属性变更事件,防止内存泄漏 // if (Devices != null) // { // foreach (var device in Devices) // { // device.PropertyChanged -= Device_PropertyChanged; // } // } // // Devices = await _deviceRepository.GetAllAsync(); // // // 订阅新设备的属性变更事件 // if (Devices != null) // { // foreach (var device in Devices) // { // device.PropertyChanged += Device_PropertyChanged; // } // // var allVar = await _varDataRepository.GetAllAsync(); // foreach (var variable in allVar) // { // AllVariables.AddOrUpdate(variable.Id, variable, (key, old) => variable); // } // // } // // OnDeviceListChanged?.Invoke(Devices); } private void Device_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == nameof(Device.IsActive)) { if (sender is Device device) { NlogHelper.Info($"设备 {device.Name} 的IsActive状态改变为 {device.IsActive},触发设备IsActive状态变更事件。"); OnDeviceIsActiveChanged?.Invoke(device, device.IsActive); } } } /// /// 异步加载菜单数据,并进行父级关联和排序。 /// /// 表示异步操作的任务。 private async Task LoadMenus() { // MenuTrees = await _menuRepository.GetMenuTreesAsync(); // foreach (MenuBean menu in MenuTrees) // { // MenuHelper.MenuAddParent(menu); // 为菜单添加父级引用 // DataServicesHelper.SortMenus(menu); // 排序菜单 // } // // OnMenuTreeListChanged?.Invoke(MenuTrees); } // /// // /// 异步获取所有MQTT配置。 // /// // /// 包含所有MQTT配置的列表。 // public async Task> GetMqttsAsync() // { // var mqtts = await _mqttRepository.GetAllAsync(); // OnMqttListChanged?.Invoke(mqtts); // return mqtts; // } // /// // /// 异步加载MQTT配置数据。 // /// // /// 表示异步操作的任务。 // private async Task LoadMqtts() // { // Mqtts = await _mqttRepository.GetAllAsync(); // } // /// // /// 异步根据ID获取设备数据。 // /// // /// 设备ID。 // /// 设备对象,如果不存在则为null。 // public async Task GetDeviceByIdAsync(int id) // { // return await _deviceRepository.GetByIdAsync(id); // } // // /// // /// 异步加载变量数据。 // /// // /// 表示异步操作的任务。 // private async Task LoadVariables() // { // Variables = await _varDataRepository.GetAllAsync(); // } // /// // /// 异步更新变量数据。 // /// // /// 要更新的变量数据。 // /// 表示异步操作的任务。 // public async Task UpdateVariableAsync(Variable variable) // { // await _variableAppService.UpdateVariableAsync(_mapper.Map(variable)); // } public void Receive(LoadMessage message) { } }