From e43c0df1cf6beca76b46f0483d049ff8df82b2b2 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Wed, 1 Oct 2025 19:16:47 +0800 Subject: [PATCH] =?UTF-8?q?=20=E5=AE=8C=E6=88=90=E7=9A=84=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=EF=BC=9A=20=20=20=201.=20=E5=90=91=20VariableTableMan?= =?UTF-8?q?agementService=20=E6=B7=BB=E5=8A=A0=E4=BA=86=20IEventService=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=20=20=20=202.=20=E5=B0=86=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=92=8C=E4=BA=8B=E4=BB=B6=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=90=88=E5=B9=B6=E5=88=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=93=8D=E4=BD=9C=E6=96=B9=E6=B3=95=E4=B8=AD=EF=BC=9A?= =?UTF-8?q?=20=20=20=20=20=20=20-=20CreateVariableTableAsync=20=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E4=BC=9A=E5=9C=A8=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=90=8E=E8=87=AA=E5=8A=A8=E6=B7=BB=E5=8A=A0=E5=88=B0?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=B9=B6=E8=A7=A6=E5=8F=91=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=20=20=20=20=20=20=20-=20UpdateVariableTableAsync=20=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E4=BC=9A=E5=9C=A8=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=90=8E=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0=E5=86=85?= =?UTF-8?q?=E5=AD=98=E5=B9=B6=E8=A7=A6=E5=8F=91=E4=BA=8B=E4=BB=B6=20=20=20?= =?UTF-8?q?=20=20=20=20-=20DeleteVariableTableAsync=20=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E4=BC=9A=E5=9C=A8=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E4=BB=8E=E5=86=85=E5=AD=98=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=B9=B6=E8=A7=A6=E5=8F=91=E4=BA=8B=E4=BB=B6=20=20=20?= =?UTF-8?q?=203.=20=E4=BB=8E=E7=B1=BB=E4=B8=AD=E5=88=A0=E9=99=A4=E4=BA=86?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E7=9A=84=E5=86=85=E5=AD=98=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=20=20=204.=20=E4=BB=8E=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=AD=E7=A7=BB=E9=99=A4=E4=BA=86=E5=86=85=E5=AD=98=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=96=B9=E6=B3=95=20=20=20=205.=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BA=86=E6=89=80=E6=9C=89=E8=B0=83=E7=94=A8=E8=BF=99=E4=BA=9B?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=9A=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E5=AE=83=E4=BB=AC=E4=B8=8D=E5=86=8D=E8=B0=83=E7=94=A8=E5=B7=B2?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=9A=84=E5=86=85=E5=AD=98=E6=96=B9=E6=B3=95?= =?UTF-8?q?=20=20=20=206.=20=E6=89=A9=E5=B1=95=E4=BA=86=20IEventService=20?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=20VariableTableChanged=20=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/DeviceStateChangedEventArgs.cs | 2 +- DMS.Application/Interfaces/IEventService.cs | 12 ++ .../IVariableTableManagementService.cs | 20 --- DMS.Application/Services/EventService.cs | 15 ++ .../VariableTableManagementService.cs | 155 +++++++++--------- .../Monitoring/DeviceMonitoringService.cs | 1 + .../Services/S7/S7ServiceManager.cs | 1 + DMS.WPF/Services/DeviceDataService.cs | 2 +- DMS.WPF/Services/VariableDataService.cs | 5 +- DMS.WPF/Services/VariableTableDataService.cs | 5 +- .../ViewModels/Items/DeviceItemViewModel.cs | 1 + 11 files changed, 116 insertions(+), 103 deletions(-) rename {DMS.Core => DMS.Application}/Events/DeviceStateChangedEventArgs.cs (97%) diff --git a/DMS.Core/Events/DeviceStateChangedEventArgs.cs b/DMS.Application/Events/DeviceStateChangedEventArgs.cs similarity index 97% rename from DMS.Core/Events/DeviceStateChangedEventArgs.cs rename to DMS.Application/Events/DeviceStateChangedEventArgs.cs index b3e21ab..4ac6c86 100644 --- a/DMS.Core/Events/DeviceStateChangedEventArgs.cs +++ b/DMS.Application/Events/DeviceStateChangedEventArgs.cs @@ -1,6 +1,6 @@ using DMS.Core.Enums; -namespace DMS.Core.Events +namespace DMS.Application.Events { /// /// 设备状态改变事件参数 diff --git a/DMS.Application/Interfaces/IEventService.cs b/DMS.Application/Interfaces/IEventService.cs index 76ba66d..8db6560 100644 --- a/DMS.Application/Interfaces/IEventService.cs +++ b/DMS.Application/Interfaces/IEventService.cs @@ -71,6 +71,18 @@ public interface IEventService + /// + /// 变量表改变事件 + /// + event EventHandler OnVariableTableChanged; + + /// + /// 触发变量表改变事件 + /// + /// 事件发送者 + /// 变量表改变事件参数 + void RaiseVariableTableChanged(object sender, VariableTableChangedEventArgs e); + /// /// 变量值改变事件 /// diff --git a/DMS.Application/Interfaces/Management/IVariableTableManagementService.cs b/DMS.Application/Interfaces/Management/IVariableTableManagementService.cs index 72b163d..81f0804 100644 --- a/DMS.Application/Interfaces/Management/IVariableTableManagementService.cs +++ b/DMS.Application/Interfaces/Management/IVariableTableManagementService.cs @@ -5,11 +5,6 @@ namespace DMS.Application.Interfaces.Management; public interface IVariableTableManagementService { - /// - /// 当变量表数据发生变化时触发 - /// - event EventHandler OnVariableTableChanged; - /// /// 异步根据ID获取变量表DTO。 /// @@ -34,19 +29,4 @@ public interface IVariableTableManagementService /// 异步删除一个变量表。 /// 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/EventService.cs b/DMS.Application/Services/EventService.cs index 658f42e..f34a964 100644 --- a/DMS.Application/Services/EventService.cs +++ b/DMS.Application/Services/EventService.cs @@ -84,6 +84,21 @@ public class EventService : IEventService #endregion #region 变量事件 + /// + /// 变量表改变事件 + /// + public event EventHandler OnVariableTableChanged; + + /// + /// 触发变量表改变事件 + /// + /// 事件发送者 + /// 变量表改变事件参数 + public void RaiseVariableTableChanged(object sender, VariableTableChangedEventArgs e) + { + OnVariableTableChanged?.Invoke(sender, e); + } + /// /// 变量值改变事件 /// diff --git a/DMS.Application/Services/Management/VariableTableManagementService.cs b/DMS.Application/Services/Management/VariableTableManagementService.cs index fbbf1d3..2c66956 100644 --- a/DMS.Application/Services/Management/VariableTableManagementService.cs +++ b/DMS.Application/Services/Management/VariableTableManagementService.cs @@ -15,17 +15,20 @@ public class VariableTableManagementService : IVariableTableManagementService { private readonly IVariableTableAppService _variableTableAppService; private readonly IAppDataStorageService _appDataStorageService; + private readonly IEventService _eventService; /// /// 当变量表数据发生变化时触发 /// public event EventHandler OnVariableTableChanged; - public VariableTableManagementService(IVariableTableAppService variableTableAppService,IAppDataStorageService appDataStorageService - ) + public VariableTableManagementService(IVariableTableAppService variableTableAppService, + IAppDataStorageService appDataStorageService, + IEventService eventService) { _variableTableAppService = variableTableAppService; _appDataStorageService = appDataStorageService; + _eventService = eventService; } /// @@ -49,7 +52,42 @@ public class VariableTableManagementService : IVariableTableManagementService /// public async Task CreateVariableTableAsync(CreateVariableTableWithMenuDto dto) { - return await _variableTableAppService.CreateVariableTableAsync(dto); + var result = await _variableTableAppService.CreateVariableTableAsync(dto); + + // 创建成功后,将变量表添加到内存中 + if (result?.VariableTable != null) + { + // 添加null检查 + if (result.VariableTable == null) + return result; + + DeviceDto deviceDto = null; + if (_appDataStorageService.Devices != null && + _appDataStorageService.Devices.TryGetValue(result.VariableTable.DeviceId, out var device)) + { + deviceDto = device; + // 确保VariableTables不为null + if (device.VariableTables == null) + device.VariableTables = new List(); + + device.VariableTables.Add(result.VariableTable); + + // 确保Device属性不为null + if (result.VariableTable != null) + result.VariableTable.Device = device; + } + + // 确保_variableTables和result.VariableTable不为null + if (_appDataStorageService.VariableTables.TryAdd(result.VariableTable.Id, result.VariableTable)) + { + _eventService.RaiseVariableTableChanged(this, new VariableTableChangedEventArgs( + DataChangeType.Added, + result.VariableTable, + deviceDto)); + } + } + + return result; } /// @@ -57,7 +95,25 @@ public class VariableTableManagementService : IVariableTableManagementService /// public async Task UpdateVariableTableAsync(VariableTableDto variableTableDto) { - return await _variableTableAppService.UpdateVariableTableAsync(variableTableDto); + var result = await _variableTableAppService.UpdateVariableTableAsync(variableTableDto); + + // 更新成功后,更新内存中的变量表 + if (result > 0 && variableTableDto != null) + { + DeviceDto deviceDto = null; + if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) + { + deviceDto = device; + } + + _appDataStorageService.VariableTables.AddOrUpdate(variableTableDto.Id, variableTableDto, (key, oldValue) => variableTableDto); + _eventService.RaiseVariableTableChanged(this, new VariableTableChangedEventArgs( + DataChangeType.Updated, + variableTableDto, + deviceDto)); + } + + return result; } /// @@ -65,82 +121,33 @@ public class VariableTableManagementService : IVariableTableManagementService /// public async Task DeleteVariableTableAsync(int id) { - return await _variableTableAppService.DeleteVariableTableAsync(id); - } - - /// - /// 在内存中添加变量表 - /// - public void AddVariableTableToMemory(VariableTableDto variableTableDto) - { - // 添加null检查 - if (variableTableDto == null) - return; - - DeviceDto deviceDto = null; - if (_appDataStorageService.Devices != null && - _appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) + var variableTable = await _variableTableAppService.GetVariableTableByIdAsync(id); // 获取变量表信息用于内存删除 + var result = await _variableTableAppService.DeleteVariableTableAsync(id); + + // 删除成功后,从内存中移除变量表 + if (result && variableTable != null) { - deviceDto = device; - // 确保VariableTables不为null - if (device.VariableTables == null) - device.VariableTables = new List(); - - device.VariableTables.Add(variableTableDto); - - // 确保Device属性不为null - if (variableTableDto != null) - variableTableDto.Device = device; - } - - // 确保_variableTables和variableTableDto不为null - if (_appDataStorageService.VariableTables.TryAdd(variableTableDto.Id, variableTableDto)) + if (_appDataStorageService.VariableTables.TryRemove(id, out var variableTableDto)) { - OnVariableTableChanged?.Invoke(this, new VariableTableChangedEventArgs( - DataChangeType.Added, - variableTableDto, - deviceDto)); + DeviceDto deviceDto = null; + if (variableTableDto != null && _appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) + { + deviceDto = device; + if (device.VariableTables != null) + device.VariableTables.Remove(variableTableDto); + } + + _eventService.RaiseVariableTableChanged(this, new VariableTableChangedEventArgs( + DataChangeType.Deleted, + variableTableDto, + deviceDto)); } - } - - /// - /// 在内存中更新变量表 - /// - public void UpdateVariableTableInMemory(VariableTableDto variableTableDto) - { - DeviceDto deviceDto = null; - if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) - { - deviceDto = device; } - - _appDataStorageService.VariableTables.AddOrUpdate(variableTableDto.Id, variableTableDto, (key, oldValue) => variableTableDto); - OnVariableTableChanged?.Invoke(this,new VariableTableChangedEventArgs( - DataChangeType.Updated, - variableTableDto, - deviceDto)); + + return result; } - /// - /// 在内存中删除变量表 - /// - public void RemoveVariableTableFromMemory(int variableTableId) - { - if (_appDataStorageService.VariableTables.TryRemove(variableTableId, out var variableTableDto)) - { - DeviceDto deviceDto = null; - if (variableTableDto != null && _appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) - { - deviceDto = device; - device.VariableTables.Remove(variableTableDto); - } - - OnVariableTableChanged?.Invoke(this,new VariableTableChangedEventArgs( - DataChangeType.Deleted, - variableTableDto, - deviceDto)); - } - } + } \ No newline at end of file diff --git a/DMS.Application/Services/Monitoring/DeviceMonitoringService.cs b/DMS.Application/Services/Monitoring/DeviceMonitoringService.cs index 8ea917a..466593f 100644 --- a/DMS.Application/Services/Monitoring/DeviceMonitoringService.cs +++ b/DMS.Application/Services/Monitoring/DeviceMonitoringService.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; +using DMS.Application.Events; using DMS.Application.Interfaces; using DMS.Core.Events; using DMS.Core.Models; diff --git a/DMS.Infrastructure/Services/S7/S7ServiceManager.cs b/DMS.Infrastructure/Services/S7/S7ServiceManager.cs index d70f1dd..1add6ba 100644 --- a/DMS.Infrastructure/Services/S7/S7ServiceManager.cs +++ b/DMS.Infrastructure/Services/S7/S7ServiceManager.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.Diagnostics; using DMS.Application.DTOs; +using DMS.Application.Events; using DMS.Application.Interfaces; using DMS.Core.Enums; using DMS.Core.Events; diff --git a/DMS.WPF/Services/DeviceDataService.cs b/DMS.WPF/Services/DeviceDataService.cs index 3a2cddb..abb5771 100644 --- a/DMS.WPF/Services/DeviceDataService.cs +++ b/DMS.WPF/Services/DeviceDataService.cs @@ -121,7 +121,7 @@ public class DeviceDataService : IDeviceDataService if (addDto.VariableTable != null) { await _variableDataService.AddVariableTableToView(addDto.VariableTable); - _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(addDto.VariableTable); + // 添加变量表到内存的操作现在在服务内部完成,无需额外调用 if (addDto.VariableTable != null && addDto.VariableTableMenu != null) { diff --git a/DMS.WPF/Services/VariableDataService.cs b/DMS.WPF/Services/VariableDataService.cs index 2b1c0fc..ca2688e 100644 --- a/DMS.WPF/Services/VariableDataService.cs +++ b/DMS.WPF/Services/VariableDataService.cs @@ -79,8 +79,7 @@ public class VariableDataService : IVariableDataService var variableTableDto = _mapper.Map(variableTable); if (await _appDataCenterService.VariableTableManagementService.UpdateVariableTableAsync(variableTableDto) > 0) { - _appDataCenterService.VariableTableManagementService.UpdateVariableTableInMemory(variableTableDto); - + // 更新数据库后会自动更新内存,无需额外操作 return true; } @@ -111,8 +110,6 @@ public class VariableDataService : IVariableDataService _dataStorageService.Variables.Remove(variable.Id); } - _appDataCenterService.VariableTableManagementService.RemoveVariableTableFromMemory(variableTable.Id); - // 删除变量表 _dataStorageService.VariableTables.Remove(variableTable.Id); variableTable.Device.VariableTables.Remove(variableTable); diff --git a/DMS.WPF/Services/VariableTableDataService.cs b/DMS.WPF/Services/VariableTableDataService.cs index d391ed3..e8a180d 100644 --- a/DMS.WPF/Services/VariableTableDataService.cs +++ b/DMS.WPF/Services/VariableTableDataService.cs @@ -57,7 +57,7 @@ public class VariableTableDataService : IVariableTableDataService _menuDataService.AddMenuItem(_mapper.Map(resDto.Menu)); } - _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(variableTableDto); + // 添加变量表到内存的操作现在在服务内部完成,无需额外调用 // var device = _deviceDataService.Devices.FirstOrDefault(d => d.Id == variableTableDto.DeviceId); // if (device != null) @@ -82,7 +82,7 @@ public class VariableTableDataService : IVariableTableDataService var variableTableDto = _mapper.Map(variableTable); if (await _appDataCenterService.VariableTableManagementService.UpdateVariableTableAsync(variableTableDto) > 0) { - _appDataCenterService.VariableTableManagementService.UpdateVariableTableInMemory(variableTableDto); + // 更新数据库后会自动更新内存,无需额外操作 var menu = _dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && @@ -119,7 +119,6 @@ public class VariableTableDataService : IVariableTableDataService _dataStorageService.Variables.Remove(variable.Id); } - _appDataCenterService.VariableTableManagementService.RemoveVariableTableFromMemory(variableTable.Id); // 删除变量表界面相关的菜单 var variableTableMenu diff --git a/DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs b/DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs index 7845dbc..4a9712a 100644 --- a/DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs +++ b/DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs @@ -2,6 +2,7 @@ using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; +using DMS.Application.Events; using DMS.Application.Interfaces; using DMS.Core.Enums; using DMS.Core.Events;