From 1dad2a0d2f4696dbd0f5e27282f15315ff4c7a5c Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Tue, 9 Sep 2025 15:28:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90AppDataCent?= =?UTF-8?q?erService=E7=9A=84=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interfaces/IAppDataCenterService.cs | 421 +---------- .../Interfaces/IAppDataStorageService.cs | 42 ++ .../Interfaces/IDataLoaderService.cs | 15 +- .../Interfaces/IDeviceManagementService.cs | 60 ++ .../IVariableTableManagementService.cs | 53 ++ .../Services/AppDataCenterService.cs | 685 +----------------- .../Services/AppDataStorageService.cs | 43 ++ DMS.Application/Services/DataLoaderService.cs | 52 +- .../Services/DeviceManagementService.cs | 50 +- .../Services/ILogManagementService.cs | 47 ++ .../Services/IMenuManagementService.cs | 63 ++ .../Services/IMqttManagementService.cs | 46 ++ .../Services/IVariableManagementService.cs | 63 ++ .../Services/LogManagementService.cs | 40 +- .../Services/MenuManagementService.cs | 32 +- .../Services/MqttManagementService.cs | 15 +- .../Services/VariableManagementService.cs | 29 +- .../VariableTableManagementService.cs | 49 +- .../Services/MqttBackgroundService.cs | 13 +- .../Services/OpcUaBackgroundService.cs | 10 +- .../Services/OpcUaServiceManager.cs | 2 +- .../OptimizedOpcUaBackgroundService.cs | 15 +- .../Services/OptimizedS7BackgroundService.cs | 21 +- .../Services/S7BackgroundService.cs | 15 +- DMS.WPF/App.xaml.cs | 70 +- DMS.WPF/Services/DataEventService.cs | 16 +- DMS.WPF/Services/DataServices.cs | 544 -------------- DMS.WPF/Services/DeviceDataService.cs | 24 +- DMS.WPF/Services/LogDataService.cs | 10 +- DMS.WPF/Services/MenuDataService.cs | 12 +- DMS.WPF/Services/MqttDataService.cs | 8 +- DMS.WPF/Services/VariableDataService.cs | 12 +- DMS.WPF/Services/VariableTableDataService.cs | 12 +- DMS.WPF/ViewModels/LogHistoryViewModel.cs | 4 +- DMS.WPF/ViewModels/SplashViewModel.cs | 2 +- 35 files changed, 704 insertions(+), 1891 deletions(-) create mode 100644 DMS.Application/Interfaces/IAppDataStorageService.cs create mode 100644 DMS.Application/Interfaces/IDeviceManagementService.cs create mode 100644 DMS.Application/Interfaces/IVariableTableManagementService.cs create mode 100644 DMS.Application/Services/AppDataStorageService.cs create mode 100644 DMS.Application/Services/ILogManagementService.cs create mode 100644 DMS.Application/Services/IMenuManagementService.cs create mode 100644 DMS.Application/Services/IMqttManagementService.cs create mode 100644 DMS.Application/Services/IVariableManagementService.cs delete mode 100644 DMS.WPF/Services/DataServices.cs diff --git a/DMS.Application/Interfaces/IAppDataCenterService.cs b/DMS.Application/Interfaces/IAppDataCenterService.cs index 8d5fb88..737504b 100644 --- a/DMS.Application/Interfaces/IAppDataCenterService.cs +++ b/DMS.Application/Interfaces/IAppDataCenterService.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using DMS.Application.DTOs; using DMS.Application.DTOs.Events; +using DMS.Application.Services; using DMS.Core.Models; namespace DMS.Application.Interfaces; @@ -10,417 +11,11 @@ namespace DMS.Application.Interfaces; /// public interface IAppDataCenterService { - #region 设备管理 - - /// - /// 异步根据ID获取设备DTO。 - /// - Task GetDeviceByIdAsync(int id); - - /// - /// 异步获取所有设备DTO列表。 - /// - Task> GetAllDevicesAsync(); - - /// - /// 异步创建一个新设备及其关联的变量表和菜单(事务性操作)。 - /// - /// 包含设备、变量表和菜单信息的DTO。 - /// 新创建设备的DTO。 - Task CreateDeviceWithDetailsAsync(CreateDeviceWithDetailsDto dto); - - /// - /// 异步更新一个已存在的设备。 - /// - Task UpdateDeviceAsync(DeviceDto deviceDto); - - /// - /// 异步删除一个设备。 - /// - Task DeleteDeviceByIdAsync(int deviceId); - - /// - /// 异步切换设备的激活状态。 - /// - Task ToggleDeviceActiveStateAsync(int id); - - /// - /// 在内存中添加设备 - /// - void AddDeviceToMemory(DeviceDto deviceDto); - - /// - /// 在内存中更新设备 - /// - void UpdateDeviceInMemory(DeviceDto deviceDto); - - /// - /// 在内存中删除设备 - /// - void RemoveDeviceFromMemory(int deviceId); - - #endregion - - #region 变量表管理 - - /// - /// 异步根据ID获取变量表DTO。 - /// - Task GetVariableTableByIdAsync(int id); - - /// - /// 异步获取所有变量表DTO列表。 - /// - Task> GetAllVariableTablesAsync(); - - /// - /// 异步创建一个新变量表及其关联菜单(事务性操作)。 - /// - /// 包含变量表和菜单信息的DTO。 - /// 新创建变量表的DTO。 - Task CreateVariableTableAsync(CreateVariableTableWithMenuDto dto); - - /// - /// 异步更新一个已存在的变量表。 - /// - Task UpdateVariableTableAsync(VariableTableDto variableTableDto); - - /// - /// 异步删除一个变量表。 - /// - Task DeleteVariableTableAsync(int id); - - /// - /// 在内存中添加变量表 - /// - void AddVariableTableToMemory(VariableTableDto variableTableDto); - - /// - /// 在内存中更新变量表 - /// - void UpdateVariableTableInMemory(VariableTableDto variableTableDto); - - /// - /// 在内存中删除变量表 - /// - void RemoveVariableTableFromMemory(int variableTableId); - - #endregion - - #region 菜单管理 - - /// - /// 异步获取所有菜单DTO列表。 - /// - Task> GetAllMenusAsync(); - - /// - /// 异步根据ID获取菜单DTO。 - /// - Task GetMenuByIdAsync(int id); - - /// - /// 异步创建一个新菜单。 - /// - Task CreateMenuAsync(MenuBeanDto menuDto); - - /// - /// 异步更新一个已存在的菜单。 - /// - Task UpdateMenuAsync(MenuBeanDto menuDto); - - /// - /// 异步删除一个菜单。 - /// - Task DeleteMenuAsync(int id); - - /// - /// 在内存中添加菜单 - /// - void AddMenuToMemory(MenuBeanDto menuDto); - - /// - /// 在内存中更新菜单 - /// - void UpdateMenuInMemory(MenuBeanDto menuDto); - - /// - /// 在内存中删除菜单 - /// - void RemoveMenuFromMemory(int menuId); - - /// - /// 获取根菜单列表 - /// - List GetRootMenus(); - - /// - /// 根据父级ID获取子菜单列表 - /// - /// 父级菜单ID - /// 子菜单列表 - List GetChildMenus(int parentId); - - #endregion - - #region 变量管理 - - /// - /// 异步根据ID获取变量DTO。 - /// - Task GetVariableByIdAsync(int id); - - /// - /// 异步获取所有变量DTO列表。 - /// - Task> GetAllVariablesAsync(); - - /// - /// 异步创建一个新变量。 - /// - Task CreateVariableAsync(VariableDto variableDto); - - /// - /// 异步更新一个已存在的变量。 - /// - Task UpdateVariableAsync(VariableDto variableDto); - - /// - /// 异步批量更新变量。 - /// - Task UpdateVariablesAsync(List variableDtos); - - /// - /// 异步删除一个变量。 - /// - Task DeleteVariableAsync(int id); - - /// - /// 异步批量删除变量。 - /// - Task DeleteVariablesAsync(List ids); - - /// - /// 在内存中添加变量 - /// - void AddVariableToMemory(VariableDto variableDto); - - /// - /// 在内存中更新变量 - /// - void UpdateVariableInMemory(VariableDto variableDto); - - /// - /// 在内存中删除变量 - /// - void RemoveVariableFromMemory(int variableId); - - #endregion - - #region MQTT服务器管理 - - /// - /// 异步根据ID获取MQTT服务器DTO。 - /// - Task GetMqttServerByIdAsync(int id); - - /// - /// 异步获取所有MQTT服务器DTO列表。 - /// - Task> GetAllMqttServersAsync(); - - /// - /// 异步创建一个新的MQTT服务器。 - /// - Task CreateMqttServerAsync(MqttServerDto mqttServerDto); - - /// - /// 异步更新一个已存在的MQTT服务器。 - /// - Task UpdateMqttServerAsync(MqttServerDto mqttServerDto); - - /// - /// 异步删除一个MQTT服务器。 - /// - Task DeleteMqttServerAsync(int id); - - /// - /// 在内存中添加MQTT服务器 - /// - void AddMqttServerToMemory(MqttServerDto mqttServerDto); - - /// - /// 在内存中更新MQTT服务器 - /// - void UpdateMqttServerInMemory(MqttServerDto mqttServerDto); - - /// - /// 在内存中删除MQTT服务器 - /// - void RemoveMqttServerFromMemory(int mqttServerId); - - #endregion - - #region 日志管理 - - /// - /// 异步根据ID获取日志DTO。 - /// - Task GetNlogByIdAsync(int id); - - /// - /// 异步获取所有日志DTO列表。 - /// - Task> GetAllNlogsAsync(); - - /// - /// 异步获取指定数量的最新日志DTO列表。 - /// - Task> GetLatestNlogsAsync(int count); - - /// - /// 异步清空所有日志。 - /// - Task ClearAllNlogsAsync(); - - /// - /// 在内存中添加日志 - /// - void AddNlogToMemory(NlogDto nlogDto); - - /// - /// 在内存中更新日志 - /// - void UpdateNlogInMemory(NlogDto nlogDto); - - /// - /// 在内存中删除日志 - /// - void RemoveNlogFromMemory(int nlogId); - - #endregion - - #region 数据存储访问 - - /// - /// 获取所有设备的安全字典。 - /// - ConcurrentDictionary Devices { get; } - - /// - /// 获取所有变量表的安全字典。 - /// - ConcurrentDictionary VariableTables { get; } - - /// - /// 获取所有变量的安全字典。 - /// - ConcurrentDictionary Variables { get; } - - /// - /// 获取所有菜单的安全字典。 - /// - ConcurrentDictionary Menus { get; } - /// - /// 获取所有菜单树的安全字典。 - /// - ConcurrentDictionary MenuTrees { get; } - - /// - /// 获取所有MQTT服务器的安全字典。 - /// - ConcurrentDictionary MqttServers { get; } - - /// - /// 获取所有日志的安全字典。 - /// - ConcurrentDictionary Nlogs { get; } - - #endregion - - #region 数据加载和初始化 - - /// - /// 异步加载所有设备及其关联数据到内存中。 - /// - Task LoadAllDataToMemoryAsync(); - - /// - /// 异步加载所有设备及其关联数据。 - /// - Task> LoadAllDevicesAsync(); - - /// - /// 异步加载所有变量表及其关联数据。 - /// - Task> LoadAllVariableTablesAsync(); - - /// - /// 异步加载所有变量数据。 - /// - Task> LoadAllVariablesAsync(); - - /// - /// 异步加载所有菜单数据。 - /// - Task> LoadAllMenusAsync(); - - /// - /// 异步加载所有MQTT服务器数据。 - /// - Task> LoadAllMqttServersAsync(); - - /// - /// 异步加载所有日志数据。 - /// - Task> LoadAllNlogsAsync(); - - #endregion - - #region 事件定义 - - /// - /// 当数据加载完成时触发 - /// - event EventHandler OnLoadDataCompleted; - - /// - /// 当设备数据发生变化时触发 - /// - event EventHandler DeviceChanged; - - /// - /// 当变量表数据发生变化时触发 - /// - event EventHandler VariableTableChanged; - - /// - /// 当变量数据发生变化时触发 - /// - event EventHandler VariableChanged; - - /// - /// 当菜单数据发生变化时触发 - /// - event EventHandler MenuChanged; - - /// - /// 当MQTT服务器数据发生变化时触发 - /// - event EventHandler MqttServerChanged; - - /// - /// 当日志数据发生变化时触发 - /// - event EventHandler NlogChanged; - - /// - /// 当变量值发生变化时触发 - /// - event EventHandler VariableValueChanged; - - void OnVariableValueChanged(VariableValueChangedEventArgs e); - - - #endregion + ILogManagementService LogManagementService { get; set; } + IMqttManagementService MqttManagementService { get; set; } + IMenuManagementService MenuManagementService { get; set; } + IVariableManagementService VariableManagementService { get; set; } + IVariableTableManagementService VariableTableManagementService { get; set; } + IDeviceManagementService DeviceManagementService { get; set; } + IDataLoaderService DataLoaderService { get; set; } } \ No newline at end of file diff --git a/DMS.Application/Interfaces/IAppDataStorageService.cs b/DMS.Application/Interfaces/IAppDataStorageService.cs new file mode 100644 index 0000000..9ba9e0f --- /dev/null +++ b/DMS.Application/Interfaces/IAppDataStorageService.cs @@ -0,0 +1,42 @@ +using System.Collections.Concurrent; +using DMS.Application.DTOs; + +namespace DMS.Application.Interfaces; + +public interface IAppDataStorageService +{ + /// + /// 安全字典,用于存储所有设备数据 + /// + ConcurrentDictionary Devices { get; } + + /// + /// 安全字典,用于存储所有变量表数据 + /// + ConcurrentDictionary VariableTables { get; } + + /// + /// 安全字典,用于存储所有变量数据 + /// + ConcurrentDictionary Variables { get; } + + /// + /// 安全字典,用于存储所有菜单数据 + /// + ConcurrentDictionary Menus { get; } + + /// + /// 安全字典,用于存储所有菜单数据 + /// + ConcurrentDictionary MenuTrees { get; } + + /// + /// 安全字典,用于存储所有MQTT服务器数据 + /// + ConcurrentDictionary MqttServers { get; } + + /// + /// 安全字典,用于存储所有日志数据 + /// + ConcurrentDictionary Nlogs { get; } +} \ No newline at end of file diff --git a/DMS.Application/Interfaces/IDataLoaderService.cs b/DMS.Application/Interfaces/IDataLoaderService.cs index 6f210b4..db8b6cd 100644 --- a/DMS.Application/Interfaces/IDataLoaderService.cs +++ b/DMS.Application/Interfaces/IDataLoaderService.cs @@ -1,5 +1,6 @@ using System.Collections.Concurrent; using DMS.Application.DTOs; +using DMS.Application.DTOs.Events; namespace DMS.Application.Interfaces; @@ -11,14 +12,7 @@ public interface IDataLoaderService /// /// 异步加载所有设备及其关联数据到内存中 /// - Task LoadAllDataToMemoryAsync( - ConcurrentDictionary devices, - ConcurrentDictionary variableTables, - ConcurrentDictionary variables, - ConcurrentDictionary menus, - ConcurrentDictionary menuTrees, - ConcurrentDictionary mqttServers, - ConcurrentDictionary nlogs); + Task LoadAllDataToMemoryAsync(); /// /// 异步加载所有设备数据 @@ -49,4 +43,9 @@ public interface IDataLoaderService /// 异步加载所有日志数据 /// Task> LoadAllNlogsAsync(); + + /// + /// 当数据加载完成时触发 + /// + event EventHandler OnLoadDataCompleted; } \ No newline at end of file diff --git a/DMS.Application/Interfaces/IDeviceManagementService.cs b/DMS.Application/Interfaces/IDeviceManagementService.cs new file mode 100644 index 0000000..6dbbd50 --- /dev/null +++ b/DMS.Application/Interfaces/IDeviceManagementService.cs @@ -0,0 +1,60 @@ +using System.Collections.Concurrent; +using DMS.Application.DTOs; +using DMS.Application.DTOs.Events; + +namespace DMS.Application.Services; + +public interface IDeviceManagementService +{ + /// + /// 当设备数据发生变化时触发 + /// + event EventHandler OnDeviceChanged; + + /// + /// 异步根据ID获取设备DTO。 + /// + Task GetDeviceByIdAsync(int id); + + /// + /// 异步获取所有设备DTO列表。 + /// + Task> GetAllDevicesAsync(); + + /// + /// 异步创建一个新设备及其关联的变量表和菜单(事务性操作)。 + /// + Task CreateDeviceWithDetailsAsync(CreateDeviceWithDetailsDto dto); + + /// + /// 异步更新一个已存在的设备。 + /// + Task UpdateDeviceAsync(DeviceDto deviceDto); + + /// + /// 异步删除一个设备。 + /// + Task DeleteDeviceByIdAsync(int deviceId); + + /// + /// 异步切换设备的激活状态。 + /// + Task ToggleDeviceActiveStateAsync(int id); + + /// + /// 在内存中添加设备 + /// + void AddDeviceToMemory(DeviceDto deviceDto); + + /// + /// 在内存中更新设备 + /// + void UpdateDeviceInMemory(DeviceDto deviceDto); + + /// + /// 在内存中删除设备 + /// + void RemoveDeviceFromMemory(int deviceId); + + +} \ No newline at end of file diff --git a/DMS.Application/Interfaces/IVariableTableManagementService.cs b/DMS.Application/Interfaces/IVariableTableManagementService.cs new file mode 100644 index 0000000..025bd85 --- /dev/null +++ b/DMS.Application/Interfaces/IVariableTableManagementService.cs @@ -0,0 +1,53 @@ +using System.Collections.Concurrent; +using DMS.Application.DTOs; +using DMS.Application.DTOs.Events; + +namespace DMS.Application.Services; + +public interface IVariableTableManagementService +{ + /// + /// 当变量表数据发生变化时触发 + /// + event EventHandler OnVariableTableChanged; + + /// + /// 异步根据ID获取变量表DTO。 + /// + Task GetVariableTableByIdAsync(int id); + + /// + /// 异步获取所有变量表DTO列表。 + /// + Task> GetAllVariableTablesAsync(); + + /// + /// 异步创建一个新变量表及其关联菜单(事务性操作)。 + /// + Task CreateVariableTableAsync(CreateVariableTableWithMenuDto dto); + + /// + /// 异步更新一个已存在的变量表。 + /// + Task UpdateVariableTableAsync(VariableTableDto variableTableDto); + + /// + /// 异步删除一个变量表。 + /// + Task DeleteVariableTableAsync(int id); + + /// + /// 在内存中添加变量表 + /// + void AddVariableTableToMemory(VariableTableDto variableTableDto); + + /// + /// 在内存中更新变量表 + /// + void UpdateVariableTableInMemory(VariableTableDto variableTableDto); + + /// + /// 在内存中删除变量表 + /// + void RemoveVariableTableFromMemory(int variableTableId); +} \ No newline at end of file diff --git a/DMS.Application/Services/AppDataCenterService.cs b/DMS.Application/Services/AppDataCenterService.cs index 6e6a397..5fcc80f 100644 --- a/DMS.Application/Services/AppDataCenterService.cs +++ b/DMS.Application/Services/AppDataCenterService.cs @@ -20,59 +20,13 @@ namespace DMS.Application.Services; /// public class AppDataCenterService : IAppDataCenterService { - private readonly IRepositoryManager _repositoryManager; private readonly IMapper _mapper; - private readonly IDataLoaderService _dataLoaderService; - - // 管理服务 - private readonly DeviceManagementService _deviceManagementService; - private readonly VariableTableManagementService _variableTableManagementService; - private readonly VariableManagementService _variableManagementService; - private readonly MenuManagementService _menuManagementService; - private readonly MqttManagementService _mqttManagementService; - private readonly LogManagementService _logManagementService; + private readonly IRepositoryManager _repositoryManager; - /// - /// 安全字典,用于存储所有设备数据 - /// - public ConcurrentDictionary Devices { get; } = new(); - - /// - /// 安全字典,用于存储所有变量表数据 - /// - public ConcurrentDictionary VariableTables { get; } = new(); - - /// - /// 安全字典,用于存储所有变量数据 - /// - public ConcurrentDictionary Variables { get; } = new(); - - /// - /// 安全字典,用于存储所有菜单数据 - /// - public ConcurrentDictionary Menus { get; } = new(); - - /// - /// 安全字典,用于存储所有菜单数据 - /// - public ConcurrentDictionary MenuTrees { get; } = new(); - - /// - /// 安全字典,用于存储所有MQTT服务器数据 - /// - public ConcurrentDictionary MqttServers { get; } = new(); - - /// - /// 安全字典,用于存储所有日志数据 - /// - public ConcurrentDictionary Nlogs { get; } = new(); #region 事件定义 - /// - /// 当数据加载完成时触发 - /// - public event EventHandler OnLoadDataCompleted; + /// /// 当设备数据发生变化时触发 @@ -111,632 +65,43 @@ public class AppDataCenterService : IAppDataCenterService #endregion - /// - /// 构造函数,通过依赖注入获取仓储管理器和相关服务实例。 - /// - /// 仓储管理器实例。 - /// AutoMapper 实例。 - /// 设备应用服务实例。 - /// 变量表应用服务实例。 - /// 变量应用服务实例。 - /// 菜单服务实例。 - /// MQTT应用服务实例。 - /// Nlog应用服务实例。 - /// 数据加载服务实例。 + public AppDataCenterService( IRepositoryManager repositoryManager, IMapper mapper, - IDeviceAppService deviceAppService, - IVariableTableAppService variableTableAppService, - IVariableAppService variableAppService, - IMenuService menuService, - IMqttAppService mqttAppService, - INlogAppService nlogAppService, - IDataLoaderService dataLoaderService) + IDataLoaderService dataLoaderService, + IDeviceManagementService deviceManagementService, + IVariableTableManagementService variableTableManagementService, + IVariableManagementService variableManagementService, + IMenuManagementService menuManagementService, + IMqttManagementService mqttManagementService, + ILogManagementService logManagementService + ) { _repositoryManager = repositoryManager; _mapper = mapper; - _dataLoaderService = dataLoaderService; + DataLoaderService = dataLoaderService; // 初始化管理服务 - _deviceManagementService = new DeviceManagementService(deviceAppService, Devices); - _variableTableManagementService = new VariableTableManagementService(variableTableAppService, VariableTables); - _variableManagementService = new VariableManagementService(variableAppService, Variables); - _menuManagementService = new MenuManagementService(menuService, Menus, MenuTrees); - _mqttManagementService = new MqttManagementService(mqttAppService, MqttServers); - _logManagementService = new LogManagementService(nlogAppService, Nlogs); + DeviceManagementService = deviceManagementService; + VariableTableManagementService = variableTableManagementService; + VariableManagementService = variableManagementService; + MenuManagementService = menuManagementService; + MqttManagementService = mqttManagementService; + LogManagementService = logManagementService; } - #region 设备管理 + public ILogManagementService LogManagementService { get; set; } - /// - /// 异步根据ID获取设备DTO。 - /// - public async Task GetDeviceByIdAsync(int id) - { - return await _deviceManagementService.GetDeviceByIdAsync(id); - } - - /// - /// 异步获取所有设备DTO列表。 - /// - public async Task> GetAllDevicesAsync() - { - return await _deviceManagementService.GetAllDevicesAsync(); - } - - /// - /// 异步创建一个新设备及其关联的变量表和菜单(事务性操作)。 - /// - public async Task CreateDeviceWithDetailsAsync(CreateDeviceWithDetailsDto dto) - { - return await _deviceManagementService.CreateDeviceWithDetailsAsync(dto); - } - - /// - /// 异步更新一个已存在的设备。 - /// - public async Task UpdateDeviceAsync(DeviceDto deviceDto) - { - return await _deviceManagementService.UpdateDeviceAsync(deviceDto); - } - - /// - /// 异步删除一个设备。 - /// - public async Task DeleteDeviceByIdAsync(int deviceId) - { - return await _deviceManagementService.DeleteDeviceByIdAsync(deviceId); - } - - /// - /// 异步切换设备的激活状态。 - /// - public async Task ToggleDeviceActiveStateAsync(int id) - { - await _deviceManagementService.ToggleDeviceActiveStateAsync(id); - } - - /// - /// 在内存中添加设备 - /// - public void AddDeviceToMemory(DeviceDto deviceDto) - { - _deviceManagementService.AddDeviceToMemory(deviceDto, VariableTables, Variables); - } - - /// - /// 在内存中更新设备 - /// - public void UpdateDeviceInMemory(DeviceDto deviceDto) - { - _deviceManagementService.UpdateDeviceInMemory(deviceDto); - } - - /// - /// 在内存中删除设备 - /// - public void RemoveDeviceFromMemory(int deviceId) - { - _deviceManagementService.RemoveDeviceFromMemory(deviceId, VariableTables, Variables); - } - - #endregion - - #region 变量表管理 - - /// - /// 异步根据ID获取变量表DTO。 - /// - public async Task GetVariableTableByIdAsync(int id) - { - return await _variableTableManagementService.GetVariableTableByIdAsync(id); - } - - /// - /// 异步获取所有变量表DTO列表。 - /// - public async Task> GetAllVariableTablesAsync() - { - return await _variableTableManagementService.GetAllVariableTablesAsync(); - } - - /// - /// 异步创建一个新变量表及其关联菜单(事务性操作)。 - /// - public async Task CreateVariableTableAsync(CreateVariableTableWithMenuDto dto) - { - return await _variableTableManagementService.CreateVariableTableAsync(dto); - } - - /// - /// 异步更新一个已存在的变量表。 - /// - public async Task UpdateVariableTableAsync(VariableTableDto variableTableDto) - { - return await _variableTableManagementService.UpdateVariableTableAsync(variableTableDto); - } - - /// - /// 异步删除一个变量表。 - /// - public async Task DeleteVariableTableAsync(int id) - { - return await _variableTableManagementService.DeleteVariableTableAsync(id); - } - - /// - /// 在内存中添加变量表 - /// - public void AddVariableTableToMemory(VariableTableDto variableTableDto) - { - _variableTableManagementService.AddVariableTableToMemory(variableTableDto, Devices); - } - - /// - /// 在内存中更新变量表 - /// - public void UpdateVariableTableInMemory(VariableTableDto variableTableDto) - { - _variableTableManagementService.UpdateVariableTableInMemory(variableTableDto, Devices); - } - - /// - /// 在内存中删除变量表 - /// - public void RemoveVariableTableFromMemory(int variableTableId) - { - _variableTableManagementService.RemoveVariableTableFromMemory(variableTableId, Devices); - } - - #endregion - - #region 菜单管理 - - /// - /// 异步获取所有菜单DTO列表。 - /// - public async Task> GetAllMenusAsync() - { - return await _menuManagementService.GetAllMenusAsync(); - } - - /// - /// 异步根据ID获取菜单DTO。 - /// - public async Task GetMenuByIdAsync(int id) - { - return await _menuManagementService.GetMenuByIdAsync(id); - } - - /// - /// 异步创建一个新菜单。 - /// - public async Task CreateMenuAsync(MenuBeanDto menuDto) - { - return await _menuManagementService.CreateMenuAsync(menuDto); - } - - /// - /// 异步更新一个已存在的菜单。 - /// - public async Task UpdateMenuAsync(MenuBeanDto menuDto) - { - await _menuManagementService.UpdateMenuAsync(menuDto); - } - - /// - /// 异步删除一个菜单。 - /// - public async Task DeleteMenuAsync(int id) - { - await _menuManagementService.DeleteMenuAsync(id); - } - - /// - /// 在内存中添加菜单 - /// - public void AddMenuToMemory(MenuBeanDto menuDto) - { - _menuManagementService.AddMenuToMemory(menuDto); - } - - /// - /// 在内存中更新菜单 - /// - public void UpdateMenuInMemory(MenuBeanDto menuDto) - { - _menuManagementService.UpdateMenuInMemory(menuDto); - } - - /// - /// 在内存中删除菜单 - /// - public void RemoveMenuFromMemory(int menuId) - { - _menuManagementService.RemoveMenuFromMemory(menuId); - } - - /// - /// 获取根菜单列表 - /// - public List GetRootMenus() - { - return _menuManagementService.GetRootMenus(); - } - - /// - /// 根据父级ID获取子菜单列表 - /// - /// 父级菜单ID - /// 子菜单列表 - public List GetChildMenus(int parentId) - { - return _menuManagementService.GetChildMenus(parentId); - } - - #endregion - - #region 变量管理 - - /// - /// 异步根据ID获取变量DTO。 - /// - public async Task GetVariableByIdAsync(int id) - { - return await _variableManagementService.GetVariableByIdAsync(id); - } - - /// - /// 异步获取所有变量DTO列表。 - /// - public async Task> GetAllVariablesAsync() - { - return await _variableManagementService.GetAllVariablesAsync(); - } - - /// - /// 异步创建一个新变量。 - /// - public async Task CreateVariableAsync(VariableDto variableDto) - { - return await _variableManagementService.CreateVariableAsync(variableDto); - } - - /// - /// 异步更新一个已存在的变量。 - /// - public async Task UpdateVariableAsync(VariableDto variableDto) - { - return await _variableManagementService.UpdateVariableAsync(variableDto); - } - - /// - /// 异步批量更新变量。 - /// - public async Task UpdateVariablesAsync(List variableDtos) - { - return await _variableManagementService.UpdateVariablesAsync(variableDtos); - } - - /// - /// 异步删除一个变量。 - /// - public async Task DeleteVariableAsync(int id) - { - return await _variableManagementService.DeleteVariableAsync(id); - } - - /// - /// 异步批量删除变量。 - /// - public async Task DeleteVariablesAsync(List ids) - { - return await _variableManagementService.DeleteVariablesAsync(ids); - } - - /// - /// 在内存中添加变量 - /// - public void AddVariableToMemory(VariableDto variableDto) - { - _variableManagementService.AddVariableToMemory(variableDto, VariableTables); - } - - /// - /// 在内存中更新变量 - /// - public void UpdateVariableInMemory(VariableDto variableDto) - { - _variableManagementService.UpdateVariableInMemory(variableDto, VariableTables); - } - - /// - /// 在内存中删除变量 - /// - public void RemoveVariableFromMemory(int variableId) - { - _variableManagementService.RemoveVariableFromMemory(variableId, VariableTables); - } - - #endregion - - #region MQTT服务器管理 - - /// - /// 异步根据ID获取MQTT服务器DTO。 - /// - public async Task GetMqttServerByIdAsync(int id) - { - return await _mqttManagementService.GetMqttServerByIdAsync(id); - } - - /// - /// 异步获取所有MQTT服务器DTO列表。 - /// - public async Task> GetAllMqttServersAsync() - { - return await _mqttManagementService.GetAllMqttServersAsync(); - } - - /// - /// 异步创建一个新的MQTT服务器。 - /// - public async Task CreateMqttServerAsync(MqttServerDto mqttServerDto) - { - return await _mqttManagementService.CreateMqttServerAsync(mqttServerDto); - } - - /// - /// 异步更新一个已存在的MQTT服务器。 - /// - public async Task UpdateMqttServerAsync(MqttServerDto mqttServerDto) - { - await _mqttManagementService.UpdateMqttServerAsync(mqttServerDto); - } - - /// - /// 异步删除一个MQTT服务器。 - /// - public async Task DeleteMqttServerAsync(int id) - { - await _mqttManagementService.DeleteMqttServerAsync(id); - } - - /// - /// 在内存中添加MQTT服务器 - /// - public void AddMqttServerToMemory(MqttServerDto mqttServerDto) - { - _mqttManagementService.AddMqttServerToMemory(mqttServerDto); - } - - /// - /// 在内存中更新MQTT服务器 - /// - public void UpdateMqttServerInMemory(MqttServerDto mqttServerDto) - { - _mqttManagementService.UpdateMqttServerInMemory(mqttServerDto); - } - - /// - /// 在内存中删除MQTT服务器 - /// - public void RemoveMqttServerFromMemory(int mqttServerId) - { - _mqttManagementService.RemoveMqttServerFromMemory(mqttServerId); - } - - #endregion - - #region 数据加载和初始化 - - /// - /// 异步加载所有设备及其关联数据到内存中。 - /// - public async Task LoadAllDataToMemoryAsync() - { - try - { - // 委托给数据加载服务加载所有数据 - await _dataLoaderService.LoadAllDataToMemoryAsync( - Devices, - VariableTables, - Variables, - Menus, - MenuTrees, - MqttServers, - Nlogs); - - // 构建菜单树 - _menuManagementService.BuildMenuTree(); - - // 触发数据加载完成事件 - OnDataLoadCompleted(new DataLoadCompletedEventArgs(true, "数据加载完成")); - } - catch (Exception ex) - { - OnDataLoadCompleted(new DataLoadCompletedEventArgs(false, $"数据加载失败: {ex.Message}")); - throw; - } - } - - /// - /// 异步加载所有设备及其关联数据。 - /// - public async Task> LoadAllDevicesAsync() - { - return await _dataLoaderService.LoadAllDevicesAsync(); - } - - /// - /// 异步加载所有变量表及其关联数据。 - /// - public async Task> LoadAllVariableTablesAsync() - { - return await _dataLoaderService.LoadAllVariableTablesAsync(); - } - - /// - /// 异步加载所有变量数据。 - /// - public async Task> LoadAllVariablesAsync() - { - return await _dataLoaderService.LoadAllVariablesAsync(); - } - - /// - /// 异步加载所有菜单数据。 - /// - public async Task> LoadAllMenusAsync() - { - return await _dataLoaderService.LoadAllMenusAsync(); - } - - /// - /// 异步加载所有MQTT服务器数据。 - /// - public async Task> LoadAllMqttServersAsync() - { - return await _dataLoaderService.LoadAllMqttServersAsync(); - } - - /// - /// 异步加载所有日志数据。 - /// - public async Task> LoadAllNlogsAsync() - { - return await _dataLoaderService.LoadAllNlogsAsync(); - } - - #endregion - - #region 事件触发方法 - - /// - /// 触发数据加载完成事件 - /// - protected virtual void OnDataLoadCompleted(DataLoadCompletedEventArgs e) - { - OnLoadDataCompleted?.Invoke(this, e); - } - - /// - /// 触发设备变更事件 - /// - protected virtual void OnDeviceChanged(DeviceChangedEventArgs e) - { - DeviceChanged?.Invoke(this, e); - } - - /// - /// 触发变量表变更事件 - /// - protected virtual void OnVariableTableChanged(VariableTableChangedEventArgs e) - { - VariableTableChanged?.Invoke(this, e); - } - - /// - /// 触发变量变更事件 - /// - protected virtual void OnVariableChanged(VariableChangedEventArgs e) - { - VariableChanged?.Invoke(this, e); - } - - /// - /// 触发菜单变更事件 - /// - protected virtual void OnMenuChanged(MenuChangedEventArgs e) - { - MenuChanged?.Invoke(this, e); - } + public IMqttManagementService MqttManagementService { get; set; } - /// - /// 触发MQTT服务器变更事件 - /// - protected virtual void OnMqttServerChanged(MqttServerChangedEventArgs e) - { - MqttServerChanged?.Invoke(this, e); - } - - /// - /// 触发日志变更事件 - /// - protected virtual void OnNlogChanged(NlogChangedEventArgs e) - { - NlogChanged?.Invoke(this, e); - } - - - /// - /// 触发变量值变更事件 - /// - public void OnVariableValueChanged(VariableValueChangedEventArgs e) - { - VariableValueChanged?.Invoke(this, e); - } - - #endregion - - #region 日志管理 - - /// - /// 异步根据ID获取日志DTO。 - /// - public async Task GetNlogByIdAsync(int id) - { - return await _logManagementService.GetNlogByIdAsync(id); - } + public IMenuManagementService MenuManagementService { get; set; } - /// - /// 异步获取所有日志DTO列表。 - /// - public async Task> GetAllNlogsAsync() - { - return await _logManagementService.GetAllNlogsAsync(); - } + public IVariableManagementService VariableManagementService { get; set; } - /// - /// 异步获取指定数量的最新日志DTO列表。 - /// - public async Task> GetLatestNlogsAsync(int count) - { - return await _logManagementService.GetLatestNlogsAsync(count); - } + public IVariableTableManagementService VariableTableManagementService { get; set; } - /// - /// 异步清空所有日志。 - /// - public async Task ClearAllNlogsAsync() - { - await _logManagementService.ClearAllNlogsAsync(); - } - - /// - /// 在内存中添加日志 - /// - public void AddNlogToMemory(NlogDto nlogDto) - { - _logManagementService.AddNlogToMemory(nlogDto); - } - - /// - /// 在内存中更新日志 - /// - public void UpdateNlogInMemory(NlogDto nlogDto) - { - _logManagementService.UpdateNlogInMemory(nlogDto); - } - - /// - /// 在内存中删除日志 - /// - public void RemoveNlogFromMemory(int nlogId) - { - _logManagementService.RemoveNlogFromMemory(nlogId); - } + public IDeviceManagementService DeviceManagementService { get; set; } - #endregion + public IDataLoaderService DataLoaderService { get; set; } } \ No newline at end of file diff --git a/DMS.Application/Services/AppDataStorageService.cs b/DMS.Application/Services/AppDataStorageService.cs new file mode 100644 index 0000000..57fabc9 --- /dev/null +++ b/DMS.Application/Services/AppDataStorageService.cs @@ -0,0 +1,43 @@ +using System.Collections.Concurrent; +using DMS.Application.DTOs; +using DMS.Application.Interfaces; + +namespace DMS.Application.Services; + +public class AppDataStorageService : IAppDataStorageService +{ + /// + /// 安全字典,用于存储所有设备数据 + /// + public ConcurrentDictionary Devices { get; } = new(); + + /// + /// 安全字典,用于存储所有变量表数据 + /// + public ConcurrentDictionary VariableTables { get; } = new(); + + /// + /// 安全字典,用于存储所有变量数据 + /// + public ConcurrentDictionary Variables { get; } = new(); + + /// + /// 安全字典,用于存储所有菜单数据 + /// + public ConcurrentDictionary Menus { get; } = new(); + + /// + /// 安全字典,用于存储所有菜单数据 + /// + public ConcurrentDictionary MenuTrees { get; } = new(); + + /// + /// 安全字典,用于存储所有MQTT服务器数据 + /// + public ConcurrentDictionary MqttServers { get; } = new(); + + /// + /// 安全字典,用于存储所有日志数据 + /// + public ConcurrentDictionary Nlogs { get; } = new(); +} \ No newline at end of file diff --git a/DMS.Application/Services/DataLoaderService.cs b/DMS.Application/Services/DataLoaderService.cs index d960a2a..1531c0e 100644 --- a/DMS.Application/Services/DataLoaderService.cs +++ b/DMS.Application/Services/DataLoaderService.cs @@ -3,6 +3,7 @@ using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Interfaces; using System.Collections.Concurrent; +using DMS.Application.DTOs.Events; namespace DMS.Application.Services; @@ -13,16 +14,23 @@ public class DataLoaderService : IDataLoaderService { private readonly IRepositoryManager _repositoryManager; private readonly IMapper _mapper; + private readonly IAppDataStorageService _appDataStorageService; private readonly IDeviceAppService _deviceAppService; private readonly IVariableTableAppService _variableTableAppService; private readonly IVariableAppService _variableAppService; private readonly IMenuService _menuService; private readonly IMqttAppService _mqttAppService; private readonly INlogAppService _nlogAppService; + + /// + /// 当数据加载完成时触发 + /// + public event EventHandler OnLoadDataCompleted; public DataLoaderService( IRepositoryManager repositoryManager, IMapper mapper, + IAppDataStorageService appDataStorageService, IDeviceAppService deviceAppService, IVariableTableAppService variableTableAppService, IVariableAppService variableAppService, @@ -32,6 +40,7 @@ public class DataLoaderService : IDataLoaderService { _repositoryManager = repositoryManager; _mapper = mapper; + _appDataStorageService = appDataStorageService; _deviceAppService = deviceAppService; _variableTableAppService = variableTableAppService; _variableAppService = variableAppService; @@ -40,26 +49,21 @@ public class DataLoaderService : IDataLoaderService _nlogAppService = nlogAppService; } + + /// /// 异步加载所有设备及其关联数据到内存中 /// - public async Task LoadAllDataToMemoryAsync( - ConcurrentDictionary devices, - ConcurrentDictionary variableTables, - ConcurrentDictionary variables, - ConcurrentDictionary menus, - ConcurrentDictionary menuTrees, - ConcurrentDictionary mqttServers, - ConcurrentDictionary nlogs) + public async Task LoadAllDataToMemoryAsync() { // 清空现有数据 - devices.Clear(); - variableTables.Clear(); - variables.Clear(); - menus.Clear(); - menuTrees.Clear(); - mqttServers.Clear(); - nlogs.Clear(); + _appDataStorageService.Devices.Clear(); + _appDataStorageService.VariableTables.Clear(); + _appDataStorageService.Variables.Clear(); + _appDataStorageService.Menus.Clear(); + _appDataStorageService.MenuTrees.Clear(); + _appDataStorageService.MqttServers.Clear(); + _appDataStorageService.Nlogs.Clear(); // 加载所有设备 var deviceDtos = await LoadAllDevicesAsync(); @@ -90,7 +94,7 @@ public class DataLoaderService : IDataLoaderService .ToList(); // 将设备添加到安全字典 - devices.TryAdd(deviceDto.Id, deviceDto); + _appDataStorageService.Devices.TryAdd(deviceDto.Id, deviceDto); } // 建立变量表与变量的关联 @@ -99,43 +103,45 @@ public class DataLoaderService : IDataLoaderService variableTableDto.Variables = variableDtos .Where(v => v.VariableTableId == variableTableDto.Id) .ToList(); - if (devices.TryGetValue(variableTableDto.DeviceId, out var deviceDto)) + if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var deviceDto)) { variableTableDto.Device = deviceDto; } // 将变量表添加到安全字典 - variableTables.TryAdd(variableTableDto.Id, variableTableDto); + _appDataStorageService.VariableTables.TryAdd(variableTableDto.Id, variableTableDto); } // 加载MQTT服务器数据到内存 foreach (var mqttServerDto in mqttServerDtos) { - mqttServers.TryAdd(mqttServerDto.Id, mqttServerDto); + _appDataStorageService.MqttServers.TryAdd(mqttServerDto.Id, mqttServerDto); } // 加载日志数据到内存 foreach (var nlogDto in nlogDtos) { - nlogs.TryAdd(nlogDto.Id, nlogDto); + _appDataStorageService.Nlogs.TryAdd(nlogDto.Id, nlogDto); } // 将变量添加到安全字典 foreach (var variableDto in variableDtos) { - if (variableTables.TryGetValue(variableDto.VariableTableId, out var variableTableDto)) + if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTableDto)) { variableDto.VariableTable = variableTableDto; } - variables.TryAdd(variableDto.Id, variableDto); + _appDataStorageService.Variables.TryAdd(variableDto.Id, variableDto); } // 将菜单添加到安全字典 foreach (var menuDto in menuDtos) { - menus.TryAdd(menuDto.Id, menuDto); + _appDataStorageService.Menus.TryAdd(menuDto.Id, menuDto); } + + OnLoadDataCompleted?.Invoke(this,new DataLoadCompletedEventArgs(true,"数据加载成功")); } /// diff --git a/DMS.Application/Services/DeviceManagementService.cs b/DMS.Application/Services/DeviceManagementService.cs index c55a6b4..39686b5 100644 --- a/DMS.Application/Services/DeviceManagementService.cs +++ b/DMS.Application/Services/DeviceManagementService.cs @@ -1,34 +1,26 @@ -using AutoMapper; using DMS.Application.DTOs; using DMS.Application.DTOs.Events; -using DMS.Core.Models; using DMS.Application.Interfaces; -using DMS.Core.Interfaces; -using DMS.Core.Enums; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Threading.Tasks; -using System; namespace DMS.Application.Services; /// /// 设备管理服务,负责设备相关的业务逻辑。 /// -public class DeviceManagementService +public class DeviceManagementService : IDeviceManagementService { private readonly IDeviceAppService _deviceAppService; - private readonly ConcurrentDictionary _devices; + private readonly IAppDataStorageService _appDataStorageService; /// /// 当设备数据发生变化时触发 /// - public event EventHandler DeviceChanged; + public event EventHandler OnDeviceChanged; - public DeviceManagementService(IDeviceAppService deviceAppService, ConcurrentDictionary devices) + public DeviceManagementService(IDeviceAppService deviceAppService,IAppDataStorageService appDataStorageService) { _deviceAppService = deviceAppService; - _devices = devices; + _appDataStorageService = appDataStorageService; } /// @@ -82,12 +74,11 @@ public class DeviceManagementService /// /// 在内存中添加设备 /// - public void AddDeviceToMemory(DeviceDto deviceDto, ConcurrentDictionary variableTables, - ConcurrentDictionary variables) + public void AddDeviceToMemory(DeviceDto deviceDto) { - if (_devices.TryAdd(deviceDto.Id, deviceDto)) + if (_appDataStorageService.Devices.TryAdd(deviceDto.Id, deviceDto)) { - OnDeviceChanged(new DeviceChangedEventArgs(DataChangeType.Added, deviceDto)); + OnDeviceChanged?.Invoke(this,new DeviceChangedEventArgs(DataChangeType.Added, deviceDto)); } } @@ -96,39 +87,32 @@ public class DeviceManagementService /// public void UpdateDeviceInMemory(DeviceDto deviceDto) { - _devices.AddOrUpdate(deviceDto.Id, deviceDto, (key, oldValue) => deviceDto); - OnDeviceChanged(new DeviceChangedEventArgs(DataChangeType.Updated, deviceDto)); + _appDataStorageService.Devices.AddOrUpdate(deviceDto.Id, deviceDto, (key, oldValue) => deviceDto); + OnDeviceChanged?.Invoke(this,new DeviceChangedEventArgs(DataChangeType.Updated, deviceDto)); } /// /// 在内存中删除设备 /// - public void RemoveDeviceFromMemory(int deviceId, ConcurrentDictionary variableTables, - ConcurrentDictionary variables) + public void RemoveDeviceFromMemory(int deviceId) { - if (_devices.TryGetValue(deviceId, out var deviceDto)) + if (_appDataStorageService.Devices.TryGetValue(deviceId, out var deviceDto)) { foreach (var variableTable in deviceDto.VariableTables) { foreach (var variable in variableTable.Variables) { - variables.TryRemove(variable.Id, out _); + _appDataStorageService.Variables.TryRemove(variable.Id, out _); } - variableTables.TryRemove(variableTable.Id, out _); + _appDataStorageService.VariableTables.TryRemove(variableTable.Id, out _); } - _devices.TryRemove(deviceId, out _); + _appDataStorageService.Devices.TryRemove(deviceId, out _); - OnDeviceChanged(new DeviceChangedEventArgs(DataChangeType.Deleted, deviceDto)); + OnDeviceChanged?.Invoke(this,new DeviceChangedEventArgs(DataChangeType.Deleted, deviceDto)); } } - /// - /// 触发设备变更事件 - /// - protected virtual void OnDeviceChanged(DeviceChangedEventArgs e) - { - DeviceChanged?.Invoke(this, e); - } + } \ No newline at end of file diff --git a/DMS.Application/Services/ILogManagementService.cs b/DMS.Application/Services/ILogManagementService.cs new file mode 100644 index 0000000..eaa36c6 --- /dev/null +++ b/DMS.Application/Services/ILogManagementService.cs @@ -0,0 +1,47 @@ +using DMS.Application.DTOs; +using DMS.Application.DTOs.Events; + +namespace DMS.Application.Services; + +public interface ILogManagementService +{ + /// + /// 异步根据ID获取日志DTO。 + /// + Task GetNlogByIdAsync(int id); + + /// + /// 异步获取所有日志DTO列表。 + /// + Task> GetAllNlogsAsync(); + + /// + /// 异步获取指定数量的最新日志DTO列表。 + /// + Task> GetLatestNlogsAsync(int count); + + /// + /// 异步清空所有日志。 + /// + Task ClearAllNlogsAsync(); + + /// + /// 在内存中添加日志 + /// + void AddNlogToMemory(NlogDto nlogDto); + + /// + /// 在内存中更新日志 + /// + void UpdateNlogInMemory(NlogDto nlogDto); + + /// + /// 在内存中删除日志 + /// + void RemoveNlogFromMemory(int nlogId); + + /// + /// 当日志数据发生变化时触发 + /// + event EventHandler OnLogChanged; +} \ No newline at end of file diff --git a/DMS.Application/Services/IMenuManagementService.cs b/DMS.Application/Services/IMenuManagementService.cs new file mode 100644 index 0000000..4217f0c --- /dev/null +++ b/DMS.Application/Services/IMenuManagementService.cs @@ -0,0 +1,63 @@ +using DMS.Application.DTOs; + +namespace DMS.Application.Services; + +public interface IMenuManagementService +{ + /// + /// 异步获取所有菜单DTO列表。 + /// + Task> GetAllMenusAsync(); + + /// + /// 异步根据ID获取菜单DTO。 + /// + Task GetMenuByIdAsync(int id); + + /// + /// 异步创建一个新菜单。 + /// + Task CreateMenuAsync(MenuBeanDto menuDto); + + /// + /// 异步更新一个已存在的菜单。 + /// + Task UpdateMenuAsync(MenuBeanDto menuDto); + + /// + /// 异步删除一个菜单。 + /// + Task DeleteMenuAsync(int id); + + /// + /// 在内存中添加菜单 + /// + void AddMenuToMemory(MenuBeanDto menuDto); + + /// + /// 在内存中更新菜单 + /// + void UpdateMenuInMemory(MenuBeanDto menuDto); + + /// + /// 在内存中删除菜单 + /// + void RemoveMenuFromMemory(int menuId); + + /// + /// 获取根菜单列表 + /// + List GetRootMenus(); + + /// + /// 根据父级ID获取子菜单列表 + /// + /// 父级菜单ID + /// 子菜单列表 + List GetChildMenus(int parentId); + + /// + /// 构建菜单树结构 + /// + void BuildMenuTree(); +} \ No newline at end of file diff --git a/DMS.Application/Services/IMqttManagementService.cs b/DMS.Application/Services/IMqttManagementService.cs new file mode 100644 index 0000000..11a0af9 --- /dev/null +++ b/DMS.Application/Services/IMqttManagementService.cs @@ -0,0 +1,46 @@ +using DMS.Application.DTOs; + +namespace DMS.Application.Services; + +public interface IMqttManagementService +{ + /// + /// 异步根据ID获取MQTT服务器DTO。 + /// + Task GetMqttServerByIdAsync(int id); + + /// + /// 异步获取所有MQTT服务器DTO列表。 + /// + Task> GetAllMqttServersAsync(); + + /// + /// 异步创建一个新的MQTT服务器。 + /// + Task CreateMqttServerAsync(MqttServerDto mqttServerDto); + + /// + /// 异步更新一个已存在的MQTT服务器。 + /// + Task UpdateMqttServerAsync(MqttServerDto mqttServerDto); + + /// + /// 异步删除一个MQTT服务器。 + /// + Task DeleteMqttServerAsync(int id); + + /// + /// 在内存中添加MQTT服务器 + /// + void AddMqttServerToMemory(MqttServerDto mqttServerDto); + + /// + /// 在内存中更新MQTT服务器 + /// + void UpdateMqttServerInMemory(MqttServerDto mqttServerDto); + + /// + /// 在内存中删除MQTT服务器 + /// + void RemoveMqttServerFromMemory(int mqttServerId); +} \ No newline at end of file diff --git a/DMS.Application/Services/IVariableManagementService.cs b/DMS.Application/Services/IVariableManagementService.cs new file mode 100644 index 0000000..8a1267a --- /dev/null +++ b/DMS.Application/Services/IVariableManagementService.cs @@ -0,0 +1,63 @@ +using System.Collections.Concurrent; +using DMS.Application.DTOs; +using DMS.Application.DTOs.Events; + +namespace DMS.Application.Services; + +public interface IVariableManagementService +{ + /// + /// 异步根据ID获取变量DTO。 + /// + Task GetVariableByIdAsync(int id); + + /// + /// 异步获取所有变量DTO列表。 + /// + Task> GetAllVariablesAsync(); + + /// + /// 异步创建一个新变量。 + /// + Task CreateVariableAsync(VariableDto variableDto); + + /// + /// 异步更新一个已存在的变量。 + /// + Task UpdateVariableAsync(VariableDto variableDto); + + /// + /// 异步批量更新变量。 + /// + Task UpdateVariablesAsync(List variableDtos); + + /// + /// 异步删除一个变量。 + /// + Task DeleteVariableAsync(int id); + + /// + /// 异步批量删除变量。 + /// + Task DeleteVariablesAsync(List ids); + + /// + /// 在内存中添加变量 + /// + void AddVariableToMemory(VariableDto variableDto, ConcurrentDictionary variableTables); + + /// + /// 在内存中更新变量 + /// + void UpdateVariableInMemory(VariableDto variableDto, ConcurrentDictionary variableTables); + + /// + /// 在内存中删除变量 + /// + void RemoveVariableFromMemory(int variableId, ConcurrentDictionary variableTables); + + /// + /// 当变量数据发生变化时触发 + /// + event EventHandler OnVariableChanged; +} \ No newline at end of file diff --git a/DMS.Application/Services/LogManagementService.cs b/DMS.Application/Services/LogManagementService.cs index 0cec476..4360f55 100644 --- a/DMS.Application/Services/LogManagementService.cs +++ b/DMS.Application/Services/LogManagementService.cs @@ -1,35 +1,27 @@ -using AutoMapper; +using System.Collections.Concurrent; using DMS.Application.DTOs; using DMS.Application.DTOs.Events; -using DMS.Core.Models; using DMS.Application.Interfaces; -using DMS.Core.Interfaces; -using DMS.Core.Enums; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Threading.Tasks; -using System; namespace DMS.Application.Services; /// /// 日志管理服务,负责日志相关的业务逻辑。 /// -public class LogManagementService +public class LogManagementService : ILogManagementService { private readonly INlogAppService _nlogAppService; - private readonly ConcurrentDictionary _nlogs; + private readonly IAppDataStorageService _appDataStorageService; /// /// 当日志数据发生变化时触发 /// - public event EventHandler NlogChanged; + public event EventHandler OnLogChanged; - public LogManagementService(INlogAppService nlogAppService, - ConcurrentDictionary nlogs) + public LogManagementService(INlogAppService nlogAppService,IAppDataStorageService appDataStorageService) { _nlogAppService = nlogAppService; - _nlogs = nlogs; + _appDataStorageService = appDataStorageService; } /// @@ -69,9 +61,9 @@ public class LogManagementService /// public void AddNlogToMemory(NlogDto nlogDto) { - if (_nlogs.TryAdd(nlogDto.Id, nlogDto)) + if (_appDataStorageService.Nlogs.TryAdd(nlogDto.Id, nlogDto)) { - OnNlogChanged(new NlogChangedEventArgs(DataChangeType.Added, nlogDto)); + OnLogChanged?.Invoke(this,new NlogChangedEventArgs(DataChangeType.Added, nlogDto)); } } @@ -80,8 +72,8 @@ public class LogManagementService /// public void UpdateNlogInMemory(NlogDto nlogDto) { - _nlogs.AddOrUpdate(nlogDto.Id, nlogDto, (key, oldValue) => nlogDto); - OnNlogChanged(new NlogChangedEventArgs(DataChangeType.Updated, nlogDto)); + _appDataStorageService.Nlogs.AddOrUpdate(nlogDto.Id, nlogDto, (key, oldValue) => nlogDto); + OnLogChanged?.Invoke(this,new NlogChangedEventArgs(DataChangeType.Updated, nlogDto)); } /// @@ -89,17 +81,11 @@ public class LogManagementService /// public void RemoveNlogFromMemory(int nlogId) { - if (_nlogs.TryRemove(nlogId, out var nlogDto)) + if (_appDataStorageService.Nlogs.TryRemove(nlogId, out var nlogDto)) { - OnNlogChanged(new NlogChangedEventArgs(DataChangeType.Deleted, nlogDto)); + OnLogChanged?.Invoke(this,new NlogChangedEventArgs(DataChangeType.Deleted, nlogDto)); } } - /// - /// 触发日志变更事件 - /// - protected virtual void OnNlogChanged(NlogChangedEventArgs e) - { - NlogChanged?.Invoke(this, e); - } + } \ No newline at end of file diff --git a/DMS.Application/Services/MenuManagementService.cs b/DMS.Application/Services/MenuManagementService.cs index 1ff4e9a..355fbb6 100644 --- a/DMS.Application/Services/MenuManagementService.cs +++ b/DMS.Application/Services/MenuManagementService.cs @@ -15,24 +15,20 @@ namespace DMS.Application.Services; /// /// 菜单管理服务,负责菜单相关的业务逻辑。 /// -public class MenuManagementService +public class MenuManagementService : IMenuManagementService { private readonly IMenuService _menuService; - private readonly ConcurrentDictionary _menus; - private readonly ConcurrentDictionary _menuTrees; + private readonly IAppDataStorageService _appDataStorageService; /// /// 当菜单数据发生变化时触发 /// public event EventHandler MenuChanged; - public MenuManagementService(IMenuService menuService, - ConcurrentDictionary menus, - ConcurrentDictionary menuTrees) + public MenuManagementService(IMenuService menuService,IAppDataStorageService appDataStorageService) { _menuService = menuService; - _menus = menus; - _menuTrees = menuTrees; + _appDataStorageService = appDataStorageService; } /// @@ -80,10 +76,10 @@ public class MenuManagementService /// public void AddMenuToMemory(MenuBeanDto menuDto) { - if (_menus.TryAdd(menuDto.Id, menuDto)) + if (_appDataStorageService.Menus.TryAdd(menuDto.Id, menuDto)) { MenuBeanDto parentMenu = null; - if (menuDto.ParentId > 0 && _menus.TryGetValue(menuDto.ParentId, out var parent)) + if (menuDto.ParentId > 0 && _appDataStorageService.Menus.TryGetValue(menuDto.ParentId, out var parent)) { parentMenu = parent; parent.Children.Add(menuDto); @@ -98,10 +94,10 @@ public class MenuManagementService /// public void UpdateMenuInMemory(MenuBeanDto menuDto) { - _menus.AddOrUpdate(menuDto.Id, menuDto, (key, oldValue) => menuDto); + _appDataStorageService.Menus.AddOrUpdate(menuDto.Id, menuDto, (key, oldValue) => menuDto); MenuBeanDto parentMenu = null; - if (menuDto.ParentId > 0 && _menus.TryGetValue(menuDto.ParentId, out var parent)) + if (menuDto.ParentId > 0 && _appDataStorageService.Menus.TryGetValue(menuDto.ParentId, out var parent)) { parentMenu = parent; } @@ -114,10 +110,10 @@ public class MenuManagementService /// public void RemoveMenuFromMemory(int menuId) { - if (_menus.TryRemove(menuId, out var menuDto)) + if (_appDataStorageService.Menus.TryRemove(menuId, out var menuDto)) { MenuBeanDto parentMenu = null; - if (menuDto.ParentId > 0 && _menus.TryGetValue(menuDto.ParentId, out var parent)) + if (menuDto.ParentId > 0 && _appDataStorageService.Menus.TryGetValue(menuDto.ParentId, out var parent)) { parentMenu = parent; } @@ -131,7 +127,7 @@ public class MenuManagementService /// public List GetRootMenus() { - return _menus.Values.Where(m => m.ParentId == 0) + return _appDataStorageService.Menus.Values.Where(m => m.ParentId == 0) .ToList(); } @@ -142,7 +138,7 @@ public class MenuManagementService /// 子菜单列表 public List GetChildMenus(int parentId) { - return _menus.Values.Where(m => m.ParentId == parentId) + return _appDataStorageService.Menus.Values.Where(m => m.ParentId == parentId) .ToList(); } @@ -152,7 +148,7 @@ public class MenuManagementService public void BuildMenuTree() { // 清空现有菜单树 - _menuTrees.Clear(); + _appDataStorageService.MenuTrees.Clear(); // 获取所有根菜单 var rootMenus = GetRootMenus(); @@ -160,7 +156,7 @@ public class MenuManagementService // 将根菜单添加到菜单树中 foreach (var rootMenu in rootMenus) { - _menuTrees.TryAdd(rootMenu.Id, rootMenu); + _appDataStorageService.MenuTrees.TryAdd(rootMenu.Id, rootMenu); } } diff --git a/DMS.Application/Services/MqttManagementService.cs b/DMS.Application/Services/MqttManagementService.cs index 702ee46..003aa73 100644 --- a/DMS.Application/Services/MqttManagementService.cs +++ b/DMS.Application/Services/MqttManagementService.cs @@ -15,21 +15,20 @@ namespace DMS.Application.Services; /// /// MQTT管理服务,负责MQTT相关的业务逻辑。 /// -public class MqttManagementService +public class MqttManagementService : IMqttManagementService { private readonly IMqttAppService _mqttAppService; - private readonly ConcurrentDictionary _mqttServers; + private readonly IAppDataStorageService _appDataStorageService; /// /// 当MQTT服务器数据发生变化时触发 /// public event EventHandler MqttServerChanged; - public MqttManagementService(IMqttAppService mqttAppService, - ConcurrentDictionary mqttServers) + public MqttManagementService(IMqttAppService mqttAppService,IAppDataStorageService appDataStorageService) { _mqttAppService = mqttAppService; - _mqttServers = mqttServers; + _appDataStorageService = appDataStorageService; } /// @@ -77,7 +76,7 @@ public class MqttManagementService /// public void AddMqttServerToMemory(MqttServerDto mqttServerDto) { - if (_mqttServers.TryAdd(mqttServerDto.Id, mqttServerDto)) + if (_appDataStorageService.MqttServers.TryAdd(mqttServerDto.Id, mqttServerDto)) { OnMqttServerChanged(new MqttServerChangedEventArgs(DataChangeType.Added, mqttServerDto)); } @@ -88,7 +87,7 @@ public class MqttManagementService /// public void UpdateMqttServerInMemory(MqttServerDto mqttServerDto) { - _mqttServers.AddOrUpdate(mqttServerDto.Id, mqttServerDto, (key, oldValue) => mqttServerDto); + _appDataStorageService.MqttServers.AddOrUpdate(mqttServerDto.Id, mqttServerDto, (key, oldValue) => mqttServerDto); OnMqttServerChanged(new MqttServerChangedEventArgs(DataChangeType.Updated, mqttServerDto)); } @@ -97,7 +96,7 @@ public class MqttManagementService /// public void RemoveMqttServerFromMemory(int mqttServerId) { - if (_mqttServers.TryRemove(mqttServerId, out var mqttServerDto)) + if (_appDataStorageService.MqttServers.TryRemove(mqttServerId, out var mqttServerDto)) { OnMqttServerChanged(new MqttServerChangedEventArgs(DataChangeType.Deleted, mqttServerDto)); } diff --git a/DMS.Application/Services/VariableManagementService.cs b/DMS.Application/Services/VariableManagementService.cs index 15d99cf..1397e79 100644 --- a/DMS.Application/Services/VariableManagementService.cs +++ b/DMS.Application/Services/VariableManagementService.cs @@ -15,20 +15,20 @@ namespace DMS.Application.Services; /// /// 变量管理服务,负责变量相关的业务逻辑。 /// -public class VariableManagementService +public class VariableManagementService : IVariableManagementService { private readonly IVariableAppService _variableAppService; - private readonly ConcurrentDictionary _variables; + private readonly IAppDataStorageService _appDataStorageService; /// /// 当变量数据发生变化时触发 /// - public event EventHandler VariableChanged; + public event EventHandler OnVariableChanged; - public VariableManagementService(IVariableAppService variableAppService, ConcurrentDictionary variables) + public VariableManagementService(IVariableAppService variableAppService,IAppDataStorageService appDataStorageService) { _variableAppService = variableAppService; - _variables = variables; + _appDataStorageService = appDataStorageService; } /// @@ -100,9 +100,9 @@ public class VariableManagementService variableTable.Variables.Add(variableDto); } - if (_variables.TryAdd(variableDto.Id, variableDto)) + if (_appDataStorageService.Variables.TryAdd(variableDto.Id, variableDto)) { - OnVariableChanged(new VariableChangedEventArgs(DataChangeType.Added, variableDto, variableTableDto)); + OnVariableChanged?.Invoke(this,new VariableChangedEventArgs(DataChangeType.Added, variableDto, variableTableDto)); } } @@ -117,8 +117,8 @@ public class VariableManagementService variableTableDto = variableTable; } - _variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto); - OnVariableChanged(new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto)); + _appDataStorageService.Variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto); + OnVariableChanged?.Invoke(this,new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto)); } /// @@ -126,7 +126,7 @@ public class VariableManagementService /// public void RemoveVariableFromMemory(int variableId, ConcurrentDictionary variableTables) { - if (_variables.TryRemove(variableId, out var variableDto)) + if (_appDataStorageService.Variables.TryRemove(variableId, out var variableDto)) { VariableTableDto variableTableDto = null; if (variableDto != null && variableTables.TryGetValue(variableDto.VariableTableId, out var variableTable)) @@ -135,15 +135,8 @@ public class VariableManagementService variableTable.Variables.Remove(variableDto); } - OnVariableChanged(new VariableChangedEventArgs(DataChangeType.Deleted, variableDto, variableTableDto)); + OnVariableChanged?.Invoke(this,new VariableChangedEventArgs(DataChangeType.Deleted, variableDto, variableTableDto)); } } - /// - /// 触发变量变更事件 - /// - protected virtual void OnVariableChanged(VariableChangedEventArgs e) - { - VariableChanged?.Invoke(this, e); - } } \ No newline at end of file diff --git a/DMS.Application/Services/VariableTableManagementService.cs b/DMS.Application/Services/VariableTableManagementService.cs index 382f498..358569e 100644 --- a/DMS.Application/Services/VariableTableManagementService.cs +++ b/DMS.Application/Services/VariableTableManagementService.cs @@ -15,21 +15,22 @@ namespace DMS.Application.Services; /// /// 变量表管理服务,负责变量表相关的业务逻辑。 /// -public class VariableTableManagementService +public class VariableTableManagementService : IVariableTableManagementService { private readonly IVariableTableAppService _variableTableAppService; + private readonly IAppDataStorageService _appDataStorageService; private readonly ConcurrentDictionary _variableTables; /// /// 当变量表数据发生变化时触发 /// - public event EventHandler VariableTableChanged; + public event EventHandler OnVariableTableChanged; - public VariableTableManagementService(IVariableTableAppService variableTableAppService, - ConcurrentDictionary variableTables) + public VariableTableManagementService(IVariableTableAppService variableTableAppService,IAppDataStorageService appDataStorageService + ) { _variableTableAppService = variableTableAppService; - _variableTables = variableTables; + _appDataStorageService = appDataStorageService; } /// @@ -75,10 +76,10 @@ public class VariableTableManagementService /// /// 在内存中添加变量表 /// - public void AddVariableTableToMemory(VariableTableDto variableTableDto, ConcurrentDictionary devices) + public void AddVariableTableToMemory(VariableTableDto variableTableDto) { DeviceDto deviceDto = null; - if (devices.TryGetValue(variableTableDto.DeviceId, out var device)) + if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) { deviceDto = device; device.VariableTables.Add(variableTableDto); @@ -87,7 +88,7 @@ public class VariableTableManagementService if (_variableTables.TryAdd(variableTableDto.Id, variableTableDto)) { - OnVariableTableChanged(new VariableTableChangedEventArgs( + OnVariableTableChanged?.Invoke(this,new VariableTableChangedEventArgs( DataChangeType.Added, variableTableDto, deviceDto)); @@ -97,47 +98,41 @@ public class VariableTableManagementService /// /// 在内存中更新变量表 /// - public void UpdateVariableTableInMemory(VariableTableDto variableTableDto, ConcurrentDictionary devices) + public void UpdateVariableTableInMemory(VariableTableDto variableTableDto) { DeviceDto deviceDto = null; - if (devices.TryGetValue(variableTableDto.DeviceId, out var device)) + if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) { deviceDto = device; } _variableTables.AddOrUpdate(variableTableDto.Id, variableTableDto, (key, oldValue) => variableTableDto); - OnVariableTableChanged(new VariableTableChangedEventArgs( - DataChangeType.Updated, - variableTableDto, - deviceDto)); + OnVariableTableChanged?.Invoke(this,new VariableTableChangedEventArgs( + DataChangeType.Updated, + variableTableDto, + deviceDto)); } /// /// 在内存中删除变量表 /// - public void RemoveVariableTableFromMemory(int variableTableId, ConcurrentDictionary devices) + public void RemoveVariableTableFromMemory(int variableTableId) { if (_variableTables.TryRemove(variableTableId, out var variableTableDto)) { DeviceDto deviceDto = null; - if (variableTableDto != null && devices.TryGetValue(variableTableDto.DeviceId, out var device)) + if (variableTableDto != null && _appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) { deviceDto = device; device.VariableTables.Remove(variableTableDto); } - OnVariableTableChanged(new VariableTableChangedEventArgs( - DataChangeType.Deleted, - variableTableDto, - deviceDto)); + OnVariableTableChanged?.Invoke(this,new VariableTableChangedEventArgs( + DataChangeType.Deleted, + variableTableDto, + deviceDto)); } } - /// - /// 触发变量表变更事件 - /// - protected virtual void OnVariableTableChanged(VariableTableChangedEventArgs e) - { - VariableTableChanged?.Invoke(this, e); - } + } \ No newline at end of file diff --git a/DMS.Infrastructure/Services/MqttBackgroundService.cs b/DMS.Infrastructure/Services/MqttBackgroundService.cs index 6e3d656..6e15e2d 100644 --- a/DMS.Infrastructure/Services/MqttBackgroundService.cs +++ b/DMS.Infrastructure/Services/MqttBackgroundService.cs @@ -21,6 +21,7 @@ namespace DMS.Infrastructure.Services { private readonly ILogger _logger; private readonly IMqttServiceManager _mqttServiceManager; + private readonly IAppDataStorageService _appDataStorageService; private readonly IAppDataCenterService _appDataCenterService; private readonly ConcurrentDictionary _mqttServers; private readonly SemaphoreSlim _reloadSemaphore = new(0); @@ -28,14 +29,16 @@ namespace DMS.Infrastructure.Services public MqttBackgroundService( ILogger logger, IMqttServiceManager mqttServiceManager, + IAppDataStorageService appDataStorageService, IAppDataCenterService appDataCenterService) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _mqttServiceManager = mqttServiceManager ?? throw new ArgumentNullException(nameof(mqttServiceManager)); + _appDataStorageService = appDataStorageService; _appDataCenterService = appDataCenterService ?? throw new ArgumentNullException(nameof(appDataCenterService)); _mqttServers = new ConcurrentDictionary(); - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted; } private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e) @@ -185,9 +188,9 @@ namespace DMS.Infrastructure.Services _mqttServers.Clear(); // 从数据服务中心获取所有激活的MQTT服务器 - var mqttServerDtos = _appDataCenterService.MqttServers.Values - .Where(m => m.IsActive) - .ToList(); + var mqttServerDtos = _appDataStorageService.MqttServers.Values + .Where(m => m.IsActive) + .ToList(); foreach (var mqttServerDto in mqttServerDtos) { @@ -252,7 +255,7 @@ namespace DMS.Infrastructure.Services { _logger.LogInformation("正在释放MQTT后台服务资源..."); - _appDataCenterService.OnLoadDataCompleted -= OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted -= OnLoadDataCompleted; _reloadSemaphore?.Dispose(); base.Dispose(); diff --git a/DMS.Infrastructure/Services/OpcUaBackgroundService.cs b/DMS.Infrastructure/Services/OpcUaBackgroundService.cs index 7db95d5..5e184e2 100644 --- a/DMS.Infrastructure/Services/OpcUaBackgroundService.cs +++ b/DMS.Infrastructure/Services/OpcUaBackgroundService.cs @@ -18,6 +18,7 @@ public class OpcUaBackgroundService : BackgroundService { private readonly IAppDataCenterService _appDataCenterService; private readonly IDataProcessingService _dataProcessingService; + private readonly IAppDataStorageService _appDataStorageService; // private readonly IDataProcessingService _dataProcessingService; private readonly ILogger _logger; @@ -70,10 +71,11 @@ public class OpcUaBackgroundService : BackgroundService { 1800000, TimeSpan.FromMilliseconds(1800000) } // ThirtyMinutes }; - public OpcUaBackgroundService(IAppDataCenterService appDataCenterService,IDataProcessingService dataProcessingService, ILogger logger) + public OpcUaBackgroundService(IAppDataCenterService appDataCenterService,IDataProcessingService dataProcessingService,IAppDataStorageService appDataStorageService, ILogger logger) { _appDataCenterService = appDataCenterService; _dataProcessingService = dataProcessingService; + _appDataStorageService = appDataStorageService; _logger = logger; _opcUaServices = new ConcurrentDictionary(); _opcUaSubscriptions = new ConcurrentDictionary(); @@ -81,7 +83,7 @@ public class OpcUaBackgroundService : BackgroundService _opcUaPollVariablesByDeviceId = new ConcurrentDictionary>(); _opcUaVariablesByDeviceId = new ConcurrentDictionary>(); - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted; } private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e) @@ -103,7 +105,7 @@ public class OpcUaBackgroundService : BackgroundService break; } - if (_appDataCenterService.Devices.IsEmpty) + if (_appDataStorageService.Devices.IsEmpty) { _logger.LogInformation("没有可用的OPC UA设备,等待设备列表更新..."); continue; @@ -150,7 +152,7 @@ public class OpcUaBackgroundService : BackgroundService _opcUaVariables.Clear(); _logger.LogInformation("开始加载OPC UA变量...."); - var opcUaDevices = _appDataCenterService + var opcUaDevices = _appDataStorageService .Devices.Values.Where(d => d.Protocol == ProtocolType.OpcUa && d.IsActive == true) .ToList(); int totalVariableCount = 0; diff --git a/DMS.Infrastructure/Services/OpcUaServiceManager.cs b/DMS.Infrastructure/Services/OpcUaServiceManager.cs index bff1938..dc45f31 100644 --- a/DMS.Infrastructure/Services/OpcUaServiceManager.cs +++ b/DMS.Infrastructure/Services/OpcUaServiceManager.cs @@ -308,7 +308,7 @@ namespace DMS.Infrastructure.Services newValue, variable.UpdatedAt); - _appDataCenterService.OnVariableValueChanged( eventArgs); + // _appDataCenterService.OnVariableValueChanged( eventArgs); // 推送到数据处理队列 await _dataProcessingService.EnqueueAsync(variable); diff --git a/DMS.Infrastructure/Services/OptimizedOpcUaBackgroundService.cs b/DMS.Infrastructure/Services/OptimizedOpcUaBackgroundService.cs index 750c184..d075370 100644 --- a/DMS.Infrastructure/Services/OptimizedOpcUaBackgroundService.cs +++ b/DMS.Infrastructure/Services/OptimizedOpcUaBackgroundService.cs @@ -19,20 +19,23 @@ namespace DMS.Infrastructure.Services public class OptimizedOpcUaBackgroundService : BackgroundService { private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; private readonly IOpcUaServiceManager _opcUaServiceManager; private readonly ILogger _logger; private readonly SemaphoreSlim _reloadSemaphore = new SemaphoreSlim(0); public OptimizedOpcUaBackgroundService( IAppDataCenterService appDataCenterService, + IAppDataStorageService appDataStorageService, IOpcUaServiceManager opcUaServiceManager, ILogger logger) { _appDataCenterService = appDataCenterService ?? throw new ArgumentNullException(nameof(appDataCenterService)); + _appDataStorageService = appDataStorageService; _opcUaServiceManager = opcUaServiceManager ?? throw new ArgumentNullException(nameof(opcUaServiceManager)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted; } private void OnLoadDataCompleted(object sender, DataLoadCompletedEventArgs e) @@ -57,7 +60,7 @@ namespace DMS.Infrastructure.Services if (stoppingToken.IsCancellationRequested) break; - if (_appDataCenterService.Devices.IsEmpty) + if (_appDataStorageService.Devices.IsEmpty) { _logger.LogInformation("没有可用的OPC UA设备,等待设备列表更新..."); continue; @@ -93,9 +96,9 @@ namespace DMS.Infrastructure.Services try { // 获取所有活动的OPC UA设备 - var opcUaDevices = _appDataCenterService.Devices.Values - .Where(d => d.Protocol == ProtocolType.OpcUa && d.IsActive) - .ToList(); + var opcUaDevices = _appDataStorageService.Devices.Values + .Where(d => d.Protocol == ProtocolType.OpcUa && d.IsActive) + .ToList(); _logger.LogInformation("找到 {DeviceCount} 个活动的OPC UA设备", opcUaDevices.Count); @@ -145,7 +148,7 @@ namespace DMS.Infrastructure.Services { _logger.LogInformation("正在释放OPC UA后台服务资源..."); - _appDataCenterService.OnLoadDataCompleted -= OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted -= OnLoadDataCompleted; _reloadSemaphore?.Dispose(); base.Dispose(); diff --git a/DMS.Infrastructure/Services/OptimizedS7BackgroundService.cs b/DMS.Infrastructure/Services/OptimizedS7BackgroundService.cs index c141eeb..3695902 100644 --- a/DMS.Infrastructure/Services/OptimizedS7BackgroundService.cs +++ b/DMS.Infrastructure/Services/OptimizedS7BackgroundService.cs @@ -21,6 +21,7 @@ namespace DMS.Infrastructure.Services; public class OptimizedS7BackgroundService : BackgroundService { private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; private readonly IDataProcessingService _dataProcessingService; private readonly IS7ServiceManager _s7ServiceManager; private readonly ILogger _logger; @@ -55,16 +56,18 @@ public class OptimizedS7BackgroundService : BackgroundService /// public OptimizedS7BackgroundService( IAppDataCenterService appDataCenterService, + IAppDataStorageService appDataStorageService, IDataProcessingService dataProcessingService, IS7ServiceManager s7ServiceManager, ILogger logger) { _appDataCenterService = appDataCenterService; + _appDataStorageService = appDataStorageService; _dataProcessingService = dataProcessingService; _s7ServiceManager = s7ServiceManager; _logger = logger; - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted; } private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e) @@ -86,7 +89,7 @@ public class OptimizedS7BackgroundService : BackgroundService break; } - if (_appDataCenterService.Devices.IsEmpty) + if (_appDataStorageService.Devices.IsEmpty) { _logger.LogInformation("没有可用的S7设备,等待设备列表更新..."); continue; @@ -134,9 +137,9 @@ public class OptimizedS7BackgroundService : BackgroundService _variablesByPollingInterval.Clear(); _logger.LogInformation("开始加载S7变量...."); - var s7Devices = _appDataCenterService - .Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true) - .ToList(); + var s7Devices = _appDataStorageService + .Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true) + .ToList(); foreach (var s7Device in s7Devices) { @@ -173,9 +176,9 @@ public class OptimizedS7BackgroundService : BackgroundService private async Task ConnectS7ServiceAsync(CancellationToken stoppingToken) { - var s7Devices = _appDataCenterService - .Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true) - .ToList(); + var s7Devices = _appDataStorageService + .Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true) + .ToList(); var deviceIds = s7Devices.Select(d => d.Id).ToList(); await _s7ServiceManager.ConnectDevicesAsync(deviceIds, stoppingToken); @@ -237,7 +240,7 @@ public class OptimizedS7BackgroundService : BackgroundService /// private async Task PollVariablesForDeviceAsync(int deviceId, List variables, CancellationToken stoppingToken) { - if (!_appDataCenterService.Devices.TryGetValue(deviceId, out var device)) + if (!_appDataStorageService.Devices.TryGetValue(deviceId, out var device)) { _logger.LogWarning($"轮询时没有找到设备ID:{deviceId}"); return; diff --git a/DMS.Infrastructure/Services/S7BackgroundService.cs b/DMS.Infrastructure/Services/S7BackgroundService.cs index c432c98..99eddf7 100644 --- a/DMS.Infrastructure/Services/S7BackgroundService.cs +++ b/DMS.Infrastructure/Services/S7BackgroundService.cs @@ -23,6 +23,7 @@ namespace DMS.Infrastructure.Services; public class S7BackgroundService : BackgroundService { private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; private readonly IDataProcessingService _dataProcessingService; private readonly IChannelBus _channelBus; private readonly IMessenger _messenger; @@ -40,18 +41,20 @@ public class S7BackgroundService : BackgroundService /// public S7BackgroundService( IAppDataCenterService appDataCenterService, + IAppDataStorageService appDataStorageService, IDataProcessingService dataProcessingService, IChannelBus channelBus, IMessenger messenger, ILogger logger) { _appDataCenterService = appDataCenterService; + _appDataStorageService = appDataStorageService; _dataProcessingService = dataProcessingService; _channelBus = channelBus; _messenger = messenger; _logger = logger; - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted; } private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e) @@ -73,7 +76,7 @@ public class S7BackgroundService : BackgroundService break; } - if (_appDataCenterService.Devices.IsEmpty) + if (_appDataStorageService.Devices.IsEmpty) { _logger.LogInformation("没有可用的S7设备,等待设备列表更新..."); continue; @@ -114,9 +117,9 @@ public class S7BackgroundService : BackgroundService _logger.LogInformation("开始加载S7设备...."); // 获取所有激活的S7设备 - var s7Devices = _appDataCenterService - .Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true) - .ToList(); + var s7Devices = _appDataStorageService + .Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true) + .ToList(); // 清理已不存在的设备代理 var existingDeviceIds = s7Devices.Select(d => d.Id).ToHashSet(); @@ -134,7 +137,7 @@ public class S7BackgroundService : BackgroundService // 为每个设备创建或更新代理 foreach (var deviceDto in s7Devices) { - if (!_appDataCenterService.Devices.TryGetValue(deviceDto.Id, out var device)) + if (!_appDataStorageService.Devices.TryGetValue(deviceDto.Id, out var device)) continue; // 创建或更新设备代理 diff --git a/DMS.WPF/App.xaml.cs b/DMS.WPF/App.xaml.cs index 0b9ec12..927fb2e 100644 --- a/DMS.WPF/App.xaml.cs +++ b/DMS.WPF/App.xaml.cs @@ -212,15 +212,23 @@ public partial class App : System.Windows.Application services.AddTransient(); services.AddTransient(); - // 注册App服务 + // 注册App服务\r\n services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); @@ -304,34 +312,34 @@ public partial class App : System.Windows.Application loggingBuilder.SetMinimumLevel(LogLevel.Trace); // loggingBuilder.addn; // 添加NLog作为日志提供者 - // 捕获未处理的异常并记录 - AppDomain.CurrentDomain.UnhandledException += (sender, args) => - { - var ex = args.ExceptionObject as Exception; - if (ex != null) - { - // 可以使用一个专用的 Logger 来记录未处理异常 - LogManager.GetLogger("UnhandledExceptionLogger") - .Fatal($"应用程序发生未处理的异常:{ex}"); - } - }; - - // 捕获 Dispatcher 线程上的未处理异常 (UI 线程) - this.DispatcherUnhandledException += (sender, args) => - { - LogManager.GetLogger("DispatcherExceptionLogger") - .Fatal($"UI 线程发生未处理的异常:{args.Exception}"); - // 标记为已处理,防止应用程序崩溃 (生产环境慎用,可能掩盖问题) - // args.Handled = true; - }; - - // 如果您使用 Task (异步方法) 并且没有正确 await,可能会导致异常丢失, - // 可以通过以下方式捕获 Task 中的异常。 - TaskScheduler.UnobservedTaskException += (sender, args) => - { - LogManager.GetLogger("UnobservedTaskExceptionLogger") - .Fatal($"异步任务发生未观察到的异常:{args.Exception}"); - // args.SetObserved(); // 标记为已观察,防止进程终止 - }; + // // 捕获未处理的异常并记录 + // AppDomain.CurrentDomain.UnhandledException += (sender, args) => + // { + // var ex = args.ExceptionObject as Exception; + // if (ex != null) + // { + // // 可以使用一个专用的 Logger 来记录未处理异常 + // LogManager.GetLogger("UnhandledExceptionLogger") + // .Fatal($"应用程序发生未处理的异常:{ex}"); + // } + // }; + // + // // 捕获 Dispatcher 线程上的未处理异常 (UI 线程) + // this.DispatcherUnhandledException += (sender, args) => + // { + // LogManager.GetLogger("DispatcherExceptionLogger") + // .Fatal($"UI 线程发生未处理的异常:{args.Exception}"); + // // 标记为已处理,防止应用程序崩溃 (生产环境慎用,可能掩盖问题) + // // args.Handled = true; + // }; + // + // // 如果您使用 Task (异步方法) 并且没有正确 await,可能会导致异常丢失, + // // 可以通过以下方式捕获 Task 中的异常。 + // TaskScheduler.UnobservedTaskException += (sender, args) => + // { + // LogManager.GetLogger("UnobservedTaskExceptionLogger") + // .Fatal($"异步任务发生未观察到的异常:{args.Exception}"); + // // args.SetObserved(); // 标记为已观察,防止进程终止 + // }; } } \ No newline at end of file diff --git a/DMS.WPF/Services/DataEventService.cs b/DMS.WPF/Services/DataEventService.cs index 1f65691..1aefca9 100644 --- a/DMS.WPF/Services/DataEventService.cs +++ b/DMS.WPF/Services/DataEventService.cs @@ -37,10 +37,10 @@ public class DataEventService : IDataEventService // 监听变量值变更事件 - _appDataCenterService.VariableValueChanged += OnVariableValueChanged; - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; + _appDataCenterService.VariableManagementService.OnVariableChanged += OnVariableValueChanged; + _appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted; // 监听日志变更事件 - // _appDataCenterService.NlogChanged += _logDataService.OnNlogChanged; + // _appDataCenterService.OnLogChanged += _logDataService.OnNlogChanged; } private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e) @@ -60,18 +60,18 @@ public class DataEventService : IDataEventService /// /// 处理变量值变更事件。 /// - private void OnVariableValueChanged(object sender, VariableValueChangedEventArgs e) + private void OnVariableValueChanged(object? sender, VariableChangedEventArgs e) { // 在UI线程上更新变量值 App.Current.Dispatcher.BeginInvoke(new Action(() => { // 查找并更新对应的变量 - var variableToUpdate = _dataStorageService.Variables.FirstOrDefault(v => v.Id == e.VariableId); + var variableToUpdate = _dataStorageService.Variables.FirstOrDefault(v => v.Id == e.Variable.Id); if (variableToUpdate != null) { - variableToUpdate.DataValue = e.NewValue; - variableToUpdate.DisplayValue = e.NewValue; - variableToUpdate.UpdatedAt = e.UpdateTime; + variableToUpdate.DataValue = e.Variable.DataValue; + variableToUpdate.DisplayValue = e.Variable.DisplayValue; + variableToUpdate.UpdatedAt = e.Variable.UpdatedAt; } })); } diff --git a/DMS.WPF/Services/DataServices.cs b/DMS.WPF/Services/DataServices.cs deleted file mode 100644 index 79a890c..0000000 --- a/DMS.WPF/Services/DataServices.cs +++ /dev/null @@ -1,544 +0,0 @@ -using System.Collections.ObjectModel; -using System.Windows; -using AutoMapper; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Messaging; -using DMS.Application.DTOs; -using DMS.Application.DTOs.Events; -using DMS.Core.Models; -using DMS.Application.Interfaces; -using DMS.Core.Enums; -using DMS.Core.Models; -using DMS.Message; -using DMS.WPF.ViewModels.Items; -using Microsoft.IdentityModel.Protocols.OpenIdConnect; -using ObservableCollections; - -namespace DMS.WPF.Services; - -/// -/// 数据服务类,负责从数据库加载和管理各种数据,并提供数据变更通知。 -/// 继承自ObservableRecipient,可以接收消息;实现IRecipient,处理加载消息。 -/// -public partial class DataServices : ObservableObject, IRecipient, IDisposable -{ - private readonly IMapper _mapper; - private readonly IAppDataCenterService _appDataCenterService; - private readonly IMqttAppService _mqttAppService; - - - // 设备列表,使用ObservableProperty特性,当值改变时会自动触发属性变更通知。 - [ObservableProperty] - private ObservableCollection _devices; - - // 变量表列表。 - [ObservableProperty] - private ObservableCollection _variableTables; - - // 变量数据列表。 - [ObservableProperty] - private ObservableCollection _variables; - - // 菜单树列表。 - [ObservableProperty] - private ObservableCollection _menus; - - // 菜单树列表。 - [ObservableProperty] - private ObservableCollection _menuTrees; - - // MQTT配置列表。 - [ObservableProperty] - private ObservableCollection _mqttServers; - - // 日志列表。 - [ObservableProperty] - private ObservableCollection _nlogs; - - - // 设备列表变更事件,当设备列表数据更新时触发。 - public event Action> OnDeviceListChanged; - - // 菜单树列表变更事件,当菜单树数据更新时触发。 - public event Action> OnMenuTreeListChanged; - - // MQTT列表变更事件,当MQTT配置数据更新时触发。 - public event Action> OnMqttListChanged; - - /// - /// 处理变量值变更事件 - /// - private void OnVariableValueChanged(object sender, VariableValueChangedEventArgs e) - { - // 在UI线程上更新变量值 - App.Current.Dispatcher.BeginInvoke(new Action(() => - { - // 查找并更新对应的变量 - var variableToUpdate = Variables.FirstOrDefault(v => v.Id == e.VariableId); - if (variableToUpdate != null) - { - variableToUpdate.DataValue = e.NewValue; - variableToUpdate.DisplayValue = e.NewValue; - variableToUpdate.UpdatedAt = e.UpdateTime; - } - })); - } - - /// - /// 处理日志变更事件 - /// - private void OnNlogChanged(object sender, NlogChangedEventArgs e) - { - // 在UI线程上更新日志 - App.Current.Dispatcher.BeginInvoke(new Action(() => - { - switch (e.ChangeType) - { - case DataChangeType.Added: - Nlogs.Add(_mapper.Map(e.Nlog)); - break; - case DataChangeType.Updated: - var existingLog = Nlogs.FirstOrDefault(l => l.Id == e.Nlog.Id); - if (existingLog != null) - { - _mapper.Map(e.Nlog, existingLog); - } - break; - case DataChangeType.Deleted: - var logToRemove = Nlogs.FirstOrDefault(l => l.Id == e.Nlog.Id); - if (logToRemove != null) - { - Nlogs.Remove(logToRemove); - } - break; - } - })); - } - - - /// - /// DataServices类的构造函数。 - /// 初始化各个数据仓库。 - /// - /// AutoMapper 实例。 - /// 数据服务中心实例。 - /// MQTT应用服务实例。 - public DataServices(IMapper mapper, IAppDataCenterService appDataCenterService, IMqttAppService mqttAppService) - { - _mapper = mapper; - _appDataCenterService = appDataCenterService; - _mqttAppService = mqttAppService; - Devices = new ObservableCollection(); - VariableTables = new ObservableCollection(); - Variables = new ObservableCollection(); - Menus = new ObservableCollection(); - MenuTrees = new ObservableCollection(); - MqttServers = new ObservableCollection(); - Nlogs = new ObservableCollection(); - - // 监听变量值变更事件 - _appDataCenterService.VariableValueChanged += OnVariableValueChanged; - _appDataCenterService.OnLoadDataCompleted += OnLoadDataCompleted; - // 监听日志变更事件 - _appDataCenterService.NlogChanged += OnNlogChanged; - - // 注册消息接收 - // WeakReferenceMessenger.Register(this, (r, m) => r.Receive(m)); - } - - private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e) - { - if (e.IsSuccess) - { - LoadAllDatas(); - } - - } - - - /// - /// 异步加载设备数据,并以高效的方式更新UI集合。 - /// 此方法会比较新旧数据,只对有变化的设备进行更新、添加或删除,避免不必要的UI刷新。 - /// - private void LoadAllDatas() - { - - foreach (var deviceDto in _appDataCenterService.Devices.Values) - { - Devices.Add(_mapper.Map(deviceDto)); - } - foreach (var device in Devices) - { - foreach (var variableTable in device.VariableTables) - { - VariableTables.Add(variableTable); - foreach (var variable in variableTable.Variables) - { - Variables.Add(variable); - } - } - } - - Menus = _mapper.Map>(_appDataCenterService.Menus.Values); - - // 加载MQTT服务器数据 - MqttServers = _mapper.Map>(_appDataCenterService.MqttServers.Values); - - // 加载日志数据 - Nlogs = _mapper.Map>(_appDataCenterService.Nlogs.Values); - - BuildMenuTrees(); - } - - public async Task AddDevice(CreateDeviceWithDetailsDto dto) - { - var addDto = await _appDataCenterService.CreateDeviceWithDetailsAsync(dto); - //更新当前界面 - Devices.Add(_mapper.Map(addDto.Device)); - AddMenuItem(_mapper.Map(addDto.DeviceMenu)); - await AddVariableTable(addDto.VariableTable); - AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); - //更新数据中心 - _appDataCenterService.AddDeviceToMemory(addDto.Device); - _appDataCenterService.AddVariableTableToMemory(addDto.VariableTable); - _appDataCenterService.AddMenuToMemory(addDto.DeviceMenu); - _appDataCenterService.AddMenuToMemory(addDto.VariableTableMenu); - - BuildMenuTrees(); - - - return addDto; - } - - - public async Task DeleteDevice(DeviceItemViewModel device) - { - if (!await _appDataCenterService.DeleteDeviceByIdAsync(device.Id)) - { - return false; - } - - _appDataCenterService.RemoveDeviceFromMemory(device.Id); - - - // 1. 删除与设备关联的所有变量表及其变量 - foreach (var variableTable in device.VariableTables) - { - // 删除与当前变量表关联的所有变量 - DeleteVariableTable(variableTable); - } - - // 2. 删除设备 - Devices.Remove(device); - - // 3. 删除与设备关联的菜单项 - var deviceMenu = Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu && m.TargetId == device.Id); - DeleteMenuItem(deviceMenu); - - - return true; - } - - - public async Task UpdateDevice(DeviceItemViewModel device) - { - if (!_appDataCenterService.Devices.TryGetValue(device.Id, out var deviceDto)) - { - return false; - } - - _mapper.Map(device, deviceDto); - if (await _appDataCenterService.UpdateDeviceAsync(deviceDto) > 0) - { - var menu = Menus.FirstOrDefault(m => - m.MenuType == MenuType.DeviceMenu && - m.TargetId == device.Id); - if (menu != null) - { - menu.Header = device.Name; - } - } - - return true; - } - - - public async Task AddVariableTable(VariableTableDto variableTableDto, - MenuBeanDto menuDto = null, bool isAddDb = false) - { - if (variableTableDto == null) - return false; - - if (isAddDb && menuDto != null) - { - CreateVariableTableWithMenuDto createDto = new CreateVariableTableWithMenuDto(); - createDto.VariableTable = variableTableDto; - createDto.DeviceId = variableTableDto.DeviceId; - createDto.Menu = menuDto; - var resDto = await _appDataCenterService.CreateVariableTableAsync(createDto); - _mapper.Map(resDto.VariableTable, variableTableDto); - AddMenuItem(_mapper.Map(resDto.Menu)); - } - - _appDataCenterService.AddVariableTableToMemory(variableTableDto); - - var device = Devices.FirstOrDefault(d => d.Id == variableTableDto.DeviceId); - if (device != null) - { - var variableTableItemViewModel = _mapper.Map(variableTableDto); - variableTableItemViewModel.Device = device; - device.VariableTables.Add(variableTableItemViewModel); - VariableTables.Add(variableTableItemViewModel); - } - - return true; - } - - public async Task UpdateVariableTable(VariableTableItemViewModel variableTable) - { - if (variableTable==null) - { - return false; - } - - var variableTableDto = _mapper.Map(variableTable); - if (await _appDataCenterService.UpdateVariableTableAsync(variableTableDto) > 0) - { - - _appDataCenterService.UpdateVariableTableInMemory(variableTableDto); - - var menu = Menus.FirstOrDefault(m => - m.MenuType == MenuType.VariableTableMenu && - m.TargetId == variableTable.Id); - if (menu != null) - { - menu.Header = variableTable.Name; - } - - return true; - } - - return false; - - } - public async Task DeleteVariableTable(VariableTableItemViewModel variableTable, bool isDeleteDb = false) - { - if (variableTable == null) - { - return false; - } - - if (isDeleteDb) - { - if (!await _appDataCenterService.DeleteVariableTableAsync(variableTable.Id)) - { - return false; - } - } - - // 删除与当前变量表关联的所有变量 - foreach (var variable in variableTable.Variables) - { - Variables.Remove(variable); - } - - _appDataCenterService.RemoveVariableTableFromMemory(variableTable.Id); - - var variableTableMenu - = Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); - DeleteMenuItem(variableTableMenu); - // 删除变量表 - VariableTables.Remove(variableTable); - variableTable.Device.VariableTables.Remove(variableTable); - return true; - } - - - private void BuildMenuTrees() - { - MenuTrees.Clear(); - // 遍历所有菜单项,构建树形结构 - foreach (var menu in Menus) - { - var parentMenu = Menus.FirstOrDefault(m => m.Id == menu.ParentId); - // 检查是否有父ID,并且父ID不为0(通常0或null表示根节点) - if (parentMenu != null && menu.ParentId != 0) - { - // 将当前菜单添加到父菜单的Children列表中 - if (!parentMenu.Children.Contains(menu)) - { - parentMenu.Children.Add(menu); - } - } - else - { - // 如果没有父ID,则这是一个根菜单 - MenuTrees.Add(menu); - } - } - } - - - public void AddMenuItem(MenuItemViewModel menuItemViewModel) - { - if (menuItemViewModel == null) - { - return; - } - - var deviceMenu = Menus.FirstOrDefault(m => m.Id == menuItemViewModel.ParentId); - if (deviceMenu != null) - { - deviceMenu.Children.Add(menuItemViewModel); - Menus.Add(menuItemViewModel); - } - } - - public void AddVariable(VariableItemViewModel variableItem) - { - if (variableItem == null) - { - return; - } - - var variableTable = VariableTables.FirstOrDefault(d => d.Id == variableItem.VariableTableId); - if (variableTable != null) - { - variableTable.Variables.Add(variableItem); - Variables.Add(variableItem); - } - } - - private void DeleteMenuItem(MenuItemViewModel? menuItemViewModel) - { - if (menuItemViewModel == null) - { - return; - } - - // 从扁平菜单列表中移除 - Menus.Remove(menuItemViewModel); - - // 从树形结构中移除 - if (menuItemViewModel.ParentId.HasValue && menuItemViewModel.ParentId.Value != 0) - { - // 如果有父菜单,从父菜单的Children中移除 - var parentMenu = Menus.FirstOrDefault(m => m.Id == menuItemViewModel.ParentId.Value); - parentMenu?.Children.Remove(menuItemViewModel); - } - else - { - // 如果是根菜单,从MenuTrees中移除 - MenuTrees.Remove(menuItemViewModel); - } - } - - - public void DeleteVariable(int id) - { - var variableItem = Variables.FirstOrDefault(v => v.Id == id); - if (variableItem == null) - { - return; - } - - var variableTable = VariableTables.FirstOrDefault(vt => vt.Id == variableItem.VariableTableId); - - variableTable.Variables.Remove(variableItem); - - Variables.Remove(variableItem); - } - - /// - /// 异步加载所有MQTT服务器数据 - /// - public async Task LoadMqttServers(IMqttAppService mqttAppService) - { - try - { - var mqttServerDtos = await mqttAppService.GetAllMqttServersAsync(); - MqttServers = _mapper.Map>(mqttServerDtos); - OnMqttListChanged?.Invoke(mqttServerDtos); - } - catch (Exception ex) - { - // 记录异常或处理错误 - Console.WriteLine($"加载MQTT服务器数据时发生错误: {ex.Message}"); - } - } - - /// - /// 添加MQTT服务器 - /// - public async Task AddMqttServer(IMqttAppService mqttAppService, MqttServerItemViewModel mqttServer) - { - var dto = _mapper.Map(mqttServer); - var id = await mqttAppService.CreateMqttServerAsync(dto); - dto.Id = id; - - var mqttServerItem = _mapper.Map(dto); - MqttServers.Add(mqttServerItem); - - return mqttServerItem; - } - - /// - /// 更新MQTT服务器 - /// - public async Task UpdateMqttServer(IMqttAppService mqttAppService, MqttServerItemViewModel mqttServer) - { - var dto = _mapper.Map(mqttServer); - await mqttAppService.UpdateMqttServerAsync(dto); - return true; - } - - /// - /// 删除MQTT服务器 - /// - public async Task DeleteMqttServer(IMqttAppService mqttAppService, MqttServerItemViewModel mqttServer) - { - await mqttAppService.DeleteMqttServerAsync(mqttServer.Id); - MqttServers.Remove(mqttServer); - return true; - } - - /// - /// 处理LoadMessage消息 - /// - /// 加载消息 - public void Receive(LoadMessage message) - { - switch (message.LoadType) - { - case LoadTypes.Devices: - // 设备数据已在IDataCenterService中处理 - break; - case LoadTypes.Menu: - // 菜单数据已在IDataCenterService中处理 - break; - case LoadTypes.Mqtts: - _ = Task.Run(async () => await LoadMqttServers(_mqttAppService)); - break; - case LoadTypes.Logs: - // 日志数据已在IDataCenterService中处理 - break; - case LoadTypes.All: - // 加载所有数据 - LoadAllDatas(); - _ = Task.Run(async () => await LoadMqttServers(_mqttAppService)); - break; - } - } - - /// - /// 释放资源 - /// - public void Dispose() - { - // 取消事件订阅 - if (_appDataCenterService != null) - { - _appDataCenterService.VariableValueChanged -= OnVariableValueChanged; - } - } -} \ No newline at end of file diff --git a/DMS.WPF/Services/DeviceDataService.cs b/DMS.WPF/Services/DeviceDataService.cs index c03680c..07d3f53 100644 --- a/DMS.WPF/Services/DeviceDataService.cs +++ b/DMS.WPF/Services/DeviceDataService.cs @@ -15,6 +15,7 @@ public class DeviceDataService : IDeviceDataService { private readonly IMapper _mapper; private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; private readonly IDataStorageService _dataStorageService; private readonly IMenuDataService _menuDataService; private readonly IVariableDataService _variableDataService; @@ -24,10 +25,11 @@ public class DeviceDataService : IDeviceDataService /// /// AutoMapper 实例。 /// 数据服务中心实例。 - public DeviceDataService(IMapper mapper, IAppDataCenterService appDataCenterService,IDataStorageService dataStorageService,IMenuDataService menuDataService,IVariableDataService variableDataService) + public DeviceDataService(IMapper mapper, IAppDataCenterService appDataCenterService,IAppDataStorageService appDataStorageService, IDataStorageService dataStorageService,IMenuDataService menuDataService,IVariableDataService variableDataService) { _mapper = mapper; _appDataCenterService = appDataCenterService; + _appDataStorageService = appDataStorageService; _dataStorageService = dataStorageService; _menuDataService = menuDataService; _variableDataService = variableDataService; @@ -38,7 +40,7 @@ public class DeviceDataService : IDeviceDataService /// public void LoadAllDevices() { - foreach (var deviceDto in _appDataCenterService.Devices.Values) + foreach (var deviceDto in _appDataStorageService.Devices.Values) { _dataStorageService.Devices.Add(_mapper.Map(deviceDto)); } @@ -50,17 +52,17 @@ public class DeviceDataService : IDeviceDataService /// public async Task AddDevice(CreateDeviceWithDetailsDto dto) { - var addDto = await _appDataCenterService.CreateDeviceWithDetailsAsync(dto); + var addDto = await _appDataCenterService.DeviceManagementService.CreateDeviceWithDetailsAsync(dto); //更新当前界面 _dataStorageService.Devices.Add(_mapper.Map(addDto.Device)); _menuDataService.AddMenuItem(_mapper.Map(addDto.DeviceMenu)); await _variableDataService.AddVariableTable(addDto.VariableTable); _menuDataService.AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); //更新数据中心 - _appDataCenterService.AddDeviceToMemory(addDto.Device); - _appDataCenterService.AddVariableTableToMemory(addDto.VariableTable); - _appDataCenterService.AddMenuToMemory(addDto.DeviceMenu); - _appDataCenterService.AddMenuToMemory(addDto.VariableTableMenu); + _appDataCenterService.DeviceManagementService.AddDeviceToMemory(addDto.Device); + _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(addDto.VariableTable); + _appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.DeviceMenu); + _appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.VariableTableMenu); _menuDataService.BuildMenuTrees(); @@ -73,12 +75,12 @@ public class DeviceDataService : IDeviceDataService /// public async Task DeleteDevice(DeviceItemViewModel device) { - if (!await _appDataCenterService.DeleteDeviceByIdAsync(device.Id)) + if (!await _appDataCenterService.DeviceManagementService.DeleteDeviceByIdAsync(device.Id)) { return false; } - _appDataCenterService.RemoveDeviceFromMemory(device.Id); + _appDataCenterService.DeviceManagementService.RemoveDeviceFromMemory(device.Id); // 删除设备 _dataStorageService.Devices.Remove(device); @@ -91,13 +93,13 @@ public class DeviceDataService : IDeviceDataService /// public async Task UpdateDevice(DeviceItemViewModel device) { - if (!_appDataCenterService.Devices.TryGetValue(device.Id, out var deviceDto)) + if (!_appDataStorageService.Devices.TryGetValue(device.Id, out var deviceDto)) { return false; } _mapper.Map(device, deviceDto); - if (await _appDataCenterService.UpdateDeviceAsync(deviceDto) > 0) + if (await _appDataCenterService.DeviceManagementService.UpdateDeviceAsync(deviceDto) > 0) { return true; } diff --git a/DMS.WPF/Services/LogDataService.cs b/DMS.WPF/Services/LogDataService.cs index ae8b1cd..e3ea201 100644 --- a/DMS.WPF/Services/LogDataService.cs +++ b/DMS.WPF/Services/LogDataService.cs @@ -16,7 +16,7 @@ public class LogDataService : ILogDataService { private readonly IMapper _mapper; private readonly IDataStorageService _dataStorageService; - private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; @@ -24,18 +24,18 @@ public class LogDataService : ILogDataService /// LogDataService类的构造函数。 /// /// AutoMapper 实例。 - /// 数据服务中心实例。 - public LogDataService(IMapper mapper,IDataStorageService dataStorageService, IAppDataCenterService appDataCenterService) + /// 数据服务中心实例。 + public LogDataService(IMapper mapper,IDataStorageService dataStorageService, IAppDataStorageService appDataStorageService) { _mapper = mapper; _dataStorageService = dataStorageService; - _appDataCenterService = appDataCenterService; + _appDataStorageService = appDataStorageService; } public void LoadAllLog() { // 加载日志数据 - _dataStorageService.Nlogs = _mapper.Map>(_appDataCenterService.Nlogs.Values); + _dataStorageService.Nlogs = _mapper.Map>(_appDataStorageService.Nlogs.Values); } /// diff --git a/DMS.WPF/Services/MenuDataService.cs b/DMS.WPF/Services/MenuDataService.cs index 2260136..e72dfb1 100644 --- a/DMS.WPF/Services/MenuDataService.cs +++ b/DMS.WPF/Services/MenuDataService.cs @@ -1,7 +1,5 @@ using System.Collections.ObjectModel; using AutoMapper; -using CommunityToolkit.Mvvm.ComponentModel; -using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels.Items; @@ -15,7 +13,7 @@ public class MenuDataService : IMenuDataService { private readonly IMapper _mapper; private readonly IDataStorageService _dataStorageService; - private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; @@ -23,17 +21,17 @@ public class MenuDataService : IMenuDataService /// MenuDataService类的构造函数。 /// /// AutoMapper 实例。 - /// 数据服务中心实例。 - public MenuDataService(IMapper mapper,IDataStorageService dataStorageService, IAppDataCenterService appDataCenterService) + /// 数据服务中心实例。 + public MenuDataService(IMapper mapper,IDataStorageService dataStorageService, IAppDataStorageService appDataStorageService) { _mapper = mapper; _dataStorageService = dataStorageService; - _appDataCenterService = appDataCenterService; + _appDataStorageService = appDataStorageService; } public void LoadAllMenus() { - _dataStorageService.Menus = _mapper.Map>(_appDataCenterService.Menus.Values); + _dataStorageService.Menus = _mapper.Map>(_appDataStorageService.Menus.Values); BuildMenuTrees(); } diff --git a/DMS.WPF/Services/MqttDataService.cs b/DMS.WPF/Services/MqttDataService.cs index 8701fb0..fcf6b5f 100644 --- a/DMS.WPF/Services/MqttDataService.cs +++ b/DMS.WPF/Services/MqttDataService.cs @@ -14,7 +14,7 @@ namespace DMS.WPF.Services; public class MqttDataService : IMqttDataService { private readonly IMapper _mapper; - private readonly IAppDataCenterService _appDataCenterService; + private readonly IAppDataStorageService _appDataStorageService; private readonly IDataStorageService _dataStorageService; private readonly IMqttAppService _mqttAppService; @@ -24,10 +24,10 @@ public class MqttDataService : IMqttDataService /// /// AutoMapper 实例。 /// MQTT应用服务实例。 - public MqttDataService(IMapper mapper,IAppDataCenterService appDataCenterService,IDataStorageService dataStorageService, IMqttAppService mqttAppService) + public MqttDataService(IMapper mapper, IAppDataStorageService appDataStorageService, IDataStorageService dataStorageService, IMqttAppService mqttAppService) { _mapper = mapper; - _appDataCenterService = appDataCenterService; + _appDataStorageService = appDataStorageService; _dataStorageService = dataStorageService; _mqttAppService = mqttAppService; } @@ -40,7 +40,7 @@ public class MqttDataService : IMqttDataService try { // 加载MQTT服务器数据 - _dataStorageService.MqttServers = _mapper.Map>(_appDataCenterService.MqttServers.Values); + _dataStorageService.MqttServers = _mapper.Map>(_appDataStorageService.MqttServers.Values); } catch (Exception ex) { diff --git a/DMS.WPF/Services/VariableDataService.cs b/DMS.WPF/Services/VariableDataService.cs index 0433ef7..d8e0b13 100644 --- a/DMS.WPF/Services/VariableDataService.cs +++ b/DMS.WPF/Services/VariableDataService.cs @@ -60,11 +60,11 @@ public class VariableDataService : IVariableDataService createDto.VariableTable = variableTableDto; createDto.DeviceId = variableTableDto.DeviceId; createDto.Menu = menuDto; - var resDto = await _appDataCenterService.CreateVariableTableAsync(createDto); + var resDto = await _appDataCenterService.VariableTableManagementService.CreateVariableTableAsync(createDto); _mapper.Map(resDto.VariableTable, variableTableDto); } - _appDataCenterService.AddVariableTableToMemory(variableTableDto); + _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(variableTableDto); return true; } @@ -80,9 +80,9 @@ public class VariableDataService : IVariableDataService } var variableTableDto = _mapper.Map(variableTable); - if (await _appDataCenterService.UpdateVariableTableAsync(variableTableDto) > 0) + if (await _appDataCenterService.VariableTableManagementService.UpdateVariableTableAsync(variableTableDto) > 0) { - _appDataCenterService.UpdateVariableTableInMemory(variableTableDto); + _appDataCenterService.VariableTableManagementService.UpdateVariableTableInMemory(variableTableDto); return true; } @@ -102,7 +102,7 @@ public class VariableDataService : IVariableDataService if (isDeleteDb) { - if (!await _appDataCenterService.DeleteVariableTableAsync(variableTable.Id)) + if (!await _appDataCenterService.VariableTableManagementService.DeleteVariableTableAsync(variableTable.Id)) { return false; } @@ -114,7 +114,7 @@ public class VariableDataService : IVariableDataService _dataStorageService.Variables.Remove(variable); } - _appDataCenterService.RemoveVariableTableFromMemory(variableTable.Id); + _appDataCenterService.VariableTableManagementService.RemoveVariableTableFromMemory(variableTable.Id); // 删除变量表 _dataStorageService.VariableTables.Remove(variableTable); diff --git a/DMS.WPF/Services/VariableTableDataService.cs b/DMS.WPF/Services/VariableTableDataService.cs index cd76bb8..6b71d8f 100644 --- a/DMS.WPF/Services/VariableTableDataService.cs +++ b/DMS.WPF/Services/VariableTableDataService.cs @@ -50,12 +50,12 @@ public class VariableTableDataService : IVariableTableDataService createDto.VariableTable = variableTableDto; createDto.DeviceId = variableTableDto.DeviceId; createDto.Menu = menuDto; - var resDto = await _appDataCenterService.CreateVariableTableAsync(createDto); + var resDto = await _appDataCenterService.VariableTableManagementService.CreateVariableTableAsync(createDto); _mapper.Map(resDto.VariableTable, variableTableDto); _menuDataService.AddMenuItem(_mapper.Map(resDto.Menu)); } - _appDataCenterService.AddVariableTableToMemory(variableTableDto); + _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(variableTableDto); // var device = _deviceDataService.Devices.FirstOrDefault(d => d.Id == variableTableDto.DeviceId); // if (device != null) @@ -78,9 +78,9 @@ public class VariableTableDataService : IVariableTableDataService } var variableTableDto = _mapper.Map(variableTable); - if (await _appDataCenterService.UpdateVariableTableAsync(variableTableDto) > 0) + if (await _appDataCenterService.VariableTableManagementService.UpdateVariableTableAsync(variableTableDto) > 0) { - _appDataCenterService.UpdateVariableTableInMemory(variableTableDto); + _appDataCenterService.VariableTableManagementService.UpdateVariableTableInMemory(variableTableDto); var menu = _dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && @@ -105,7 +105,7 @@ public class VariableTableDataService : IVariableTableDataService if (isDeleteDb) { - if (!await _appDataCenterService.DeleteVariableTableAsync(variableTable.Id)) + if (!await _appDataCenterService.VariableTableManagementService.DeleteVariableTableAsync(variableTable.Id)) { return false; } @@ -117,7 +117,7 @@ public class VariableTableDataService : IVariableTableDataService _dataStorageService.Variables.Remove(variable); } - _appDataCenterService.RemoveVariableTableFromMemory(variableTable.Id); + _appDataCenterService.VariableTableManagementService.RemoveVariableTableFromMemory(variableTable.Id); var variableTableMenu =_dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); diff --git a/DMS.WPF/ViewModels/LogHistoryViewModel.cs b/DMS.WPF/ViewModels/LogHistoryViewModel.cs index a41d897..d1487e1 100644 --- a/DMS.WPF/ViewModels/LogHistoryViewModel.cs +++ b/DMS.WPF/ViewModels/LogHistoryViewModel.cs @@ -65,7 +65,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable LogItemListView = _synchronizedView.ToNotifyCollectionChanged(); // 订阅日志变更事件 - _appDataCenterService.NlogChanged += _wpfDataService.LogDataService.OnNlogChanged; + _appDataCenterService.LogManagementService.OnLogChanged += _wpfDataService.LogDataService.OnNlogChanged; } /// @@ -244,7 +244,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable public void Dispose() { // 取消订阅事件 - _appDataCenterService.NlogChanged -= OnNlogChanged; + _appDataCenterService.LogManagementService.OnLogChanged -= OnNlogChanged; } } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/SplashViewModel.cs b/DMS.WPF/ViewModels/SplashViewModel.cs index c8eb91f..42481d8 100644 --- a/DMS.WPF/ViewModels/SplashViewModel.cs +++ b/DMS.WPF/ViewModels/SplashViewModel.cs @@ -52,7 +52,7 @@ public partial class SplashViewModel : ObservableObject _initializeService.InitializeTables(); _initializeService.InitializeMenus(); LoadingMessage = "正在加载系统配置..."; - await _appDataCenterService.LoadAllDataToMemoryAsync(); + await _appDataCenterService.DataLoaderService.LoadAllDataToMemoryAsync(); // 可以在这里添加加载配置的逻辑 await Task.Delay(500); // 模拟耗时