From b59d3d38a7d03d0d38e2043eddf47895cb39af10 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Sat, 25 Oct 2025 20:56:23 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=E9=87=8D=E6=9E=84=E4=BA=86=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=9A=84=E5=AF=BC=E5=85=A5=E5=92=8C=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Management/VariableManagementService.cs | 1 + DMS.WPF/Interfaces/IVariableViewService.cs | 15 +- DMS.WPF/ItemViewModel/VariableItem.cs | 2 +- .../ViewService/VariableViewService.cs | 93 ++++------ DMS.WPF/ViewModels/VariableTableViewModel.cs | 166 ++++++++---------- DMS.WPF/Views/Dialogs/ImportExcelDialog.xaml | 2 +- DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml | 2 +- DMS.WPF/Views/Dialogs/VariableDialog.xaml | 6 +- 8 files changed, 111 insertions(+), 176 deletions(-) diff --git a/DMS.Application/Services/Management/VariableManagementService.cs b/DMS.Application/Services/Management/VariableManagementService.cs index fdbb25d..7d0dff0 100644 --- a/DMS.Application/Services/Management/VariableManagementService.cs +++ b/DMS.Application/Services/Management/VariableManagementService.cs @@ -174,6 +174,7 @@ public class VariableManagementService : IVariableManagementService { variable.VariableTable = variableTable; variableTable.Variables.Add(variable); + _appDataService.Variables.TryAdd(variable.Id,variable); } } _eventService.RaiseBatchImportVariables(this, new BatchImportVariablesEventArgs(result)); diff --git a/DMS.WPF/Interfaces/IVariableViewService.cs b/DMS.WPF/Interfaces/IVariableViewService.cs index 7cb904f..d2eb478 100644 --- a/DMS.WPF/Interfaces/IVariableViewService.cs +++ b/DMS.WPF/Interfaces/IVariableViewService.cs @@ -16,29 +16,18 @@ public interface IVariableViewService /// void LoadAllVariables(); - /// - /// 添加变量表。 - /// - Task AddVariableTableToView(VariableTable tableDto); - /// - /// 更新变量表。 - /// - Task UpdateVariableTable(VariableTableItem variableTable); /// /// 添加变量。 /// void AddVariable(VariableItem variableItem); - /// - /// 删除变量。 - /// - void DeleteVariable(int id); Task DeleteAsync(List deleteList); List CheckExistingVariables(List importedVariables, DeviceItem device); - Task AddAsync(List variableItems,VariableTableItem variableTable); + + Task> AddAsync(List variableItems,VariableTableItem variableTable); } \ No newline at end of file diff --git a/DMS.WPF/ItemViewModel/VariableItem.cs b/DMS.WPF/ItemViewModel/VariableItem.cs index 06bd39b..b3b6955 100644 --- a/DMS.WPF/ItemViewModel/VariableItem.cs +++ b/DMS.WPF/ItemViewModel/VariableItem.cs @@ -99,7 +99,7 @@ public partial class VariableItem : ObservableObject /// 用于在界面上显示变量表的关联信息。 /// [ObservableProperty] - private VariableTable _variableTable; + private VariableTableItem _variableTable; /// /// 获取或设置与此变量关联的MQTT别名列表。 diff --git a/DMS.WPF/Services/ViewService/VariableViewService.cs b/DMS.WPF/Services/ViewService/VariableViewService.cs index 2902267..5158d0a 100644 --- a/DMS.WPF/Services/ViewService/VariableViewService.cs +++ b/DMS.WPF/Services/ViewService/VariableViewService.cs @@ -53,45 +53,6 @@ public class VariableViewService : IVariableViewService } } - /// - /// 添加变量表。 - /// - public async Task AddVariableTableToView(VariableTable tableDto) - { - // 添加null检查 - if (tableDto == null || tableDto.DeviceId == 0) - return false; - - if (_viewDataService.Devices.TryGetValue(tableDto.DeviceId, out var device)) - { - var variableTableItem = _mapper.Map(tableDto); - device.VariableTables.Add(variableTableItem); - _viewDataService.VariableTables.TryAdd(variableTableItem.Id, variableTableItem); - } - - - return true; - } - - /// - /// 更新变量表。 - /// - public async Task UpdateVariableTable(VariableTableItem variableTableItem) - { - if (variableTableItem is null) - { - return false; - } - - var variableTable = _mapper.Map(variableTableItem); - if (await _appCenterService.VariableTableManagementService.UpdateAsync(variableTable) > 0) - { - // 更新数据库后会自动更新内存,无需额外操作 - return true; - } - - return false; - } /// @@ -110,7 +71,7 @@ public class VariableViewService : IVariableViewService /// /// 添加变量。 /// - public async Task AddAsync(List variableItems, VariableTableItem variableTable) + public async Task> AddAsync(List variableItems, VariableTableItem variableTable) { foreach (var variableDto in variableItems) @@ -123,35 +84,17 @@ public class VariableViewService : IVariableViewService var resVariables = await _variableManagementService.AddAsync(_mapper.Map>(variableItems)); - - List resVariableItems = _mapper.Map>(resVariables); foreach (var variableItem in resVariableItems) { _viewDataService.Variables.TryAdd(variableItem.Id, variableItem); variableTable.Variables.Add(variableItem); + variableItem.VariableTable = variableTable; } - return true; + return resVariableItems; } - /// - /// 删除变量。 - /// - public void DeleteVariable(int id) - { - if (!_viewDataService.Variables.TryGetValue(id, out var variableItem)) - { - return; - } - - if (_viewDataService.VariableTables.TryGetValue(variableItem.VariableTableId, out var variableTable)) - { - variableTable.Variables.Remove(variableItem); - } - - _viewDataService.Variables.Remove(variableItem.Id); - } public async Task DeleteAsync(List variableItems) { @@ -163,8 +106,19 @@ public class VariableViewService : IVariableViewService deleteList.Add(mVariable); } } + if (!deleteList.Any()) return false; - return await _variableManagementService.DeleteAsync(deleteList); + var res=await _variableManagementService.DeleteAsync(deleteList); + if (res) + { + foreach (var variable in deleteList) + { + _viewDataService.Variables.Remove(variable.Id); + variable.VariableTable.Variables.Remove(variable); + } + } + + return res; } @@ -179,8 +133,21 @@ public class VariableViewService : IVariableViewService { foreach (var item in importedVariables) { - bool slelect = item.Name == variable.Name || item.S7Address == variable.S7Address || item.OpcUaNodeId == variable.OpcUaNodeId; - if (slelect) + var isExist = false; + + if (variable.Protocol == Core.Enums.ProtocolType.S7) + { + isExist = item.Name == variable.Name || item.S7Address == variable.S7Address; + }else if (variable.Protocol == Core.Enums.ProtocolType.OpcUa) + { + isExist = item.Name == variable.Name || item.OpcUaNodeId == variable.OpcUaNodeId; + } + else + { + isExist = item.Name == variable.Name; + } + + if (isExist) { existList.Add(item); } diff --git a/DMS.WPF/ViewModels/VariableTableViewModel.cs b/DMS.WPF/ViewModels/VariableTableViewModel.cs index ca98385..93c61d0 100644 --- a/DMS.WPF/ViewModels/VariableTableViewModel.cs +++ b/DMS.WPF/ViewModels/VariableTableViewModel.cs @@ -172,14 +172,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable } } - /// - /// 当视图加载完成时调用。 - /// 初始化协议选择状态,加载变量数据,并创建原始数据的深拷贝备份。 - /// - public override void OnLoaded() - { - _variableItemList.AddRange(CurrentVariableTable.Variables); - } /// @@ -188,7 +180,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// /// 当前操作的变量表,用于更新其内部的变量数据。 [RelayCommand] - private async void UpdateVariable() + private async Task UpdateVariable() { try { @@ -247,7 +239,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// 此命令通常绑定到UI中的"从TIA导入"按钮。 /// [RelayCommand] - private async void ImprotFromTiaVarTable() + private async Task ImprotFromTiaVarTable() { try { @@ -258,33 +250,29 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable if (improtVariableItems == null || improtVariableItems.Count == 0) return; - //bool flowControl = await CheckExist(improtVariableItems); - //if (!flowControl) - //{ - // return; - //} + bool flowControl = await CheckExist(improtVariableItems); + if (!flowControl) + { + return; + } + + // 如果还有变量需要导入,则执行导入操作 + if (!improtVariableItems.Any()) + { + _notificationService.ShowSuccess("列表中没有要添加的变量了。"); + return; + } + var resList = await _variableViewService.AddAsync(improtVariableItems, CurrentVariableTable); + + if (resList is null || !resList.Any()) + { + _notificationService.ShowError("从OPC UA服务器导入变量失败"); + return; + + } + _variableItemList.AddRange(resList); + _notificationService.ShowSuccess($"从TIA变量表导入变量成功,共导入变量:{improtVariableItems.Count}个"); - //if (improtVariableDtos.Count != 0) - //{ - // var addVariableDtos = await _variableManagementService.AddAsync(improtVariableDtos); - // if (addVariableDtos is { Count: > 0 }) - // { - // List variableItemViewModels = _mapper.Map>(addVariableDtos); - - // _variableItemList.AddRange(variableItemViewModels); - // //更新数据中心 - // foreach (var variableItemViewModel in variableItemViewModels) - // { - // CurrentVariableTable.Variables.Add(variableItemViewModel); - // } - - // _notificationService.ShowSuccess($"从Excel导入变量成功,共导入变量:{improtVariableDtos.Count}个"); - // } - //} - //else - //{ - // _notificationService.ShowSuccess($"列表中没有要添加的变量了。 "); - //} } catch (Exception e) { @@ -297,7 +285,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// 此命令通常绑定到UI中的"从OPC UA导入"按钮。 /// [RelayCommand] - private async void ImportFromOpcUaServer() + private async Task ImportFromOpcUaServer() { try { @@ -320,7 +308,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable = App.Current.Services.GetRequiredService(); importOpcUaDialogViewModel.EndpointUrl = opcUaEndpointUrl; // 设置Endpoint URL var importedVariableItems = await _dialogService.ShowDialogAsync(importOpcUaDialogViewModel); - if (importedVariableItems == null || !importedVariableItems.Any()) return; // 用户取消或没有选择任何变量 + if (importedVariableItems == null || !importedVariableItems.Any()) return; // 用户取消或没有选择任何变量 //检查重复变量并询问是否继续 bool flowControl = await CheckExist(importedVariableItems); @@ -330,23 +318,22 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable } // 如果还有变量需要导入,则执行导入操作 - if (importedVariableItems.Any()) - { - var res = await _variableViewService.AddAsync(importedVariableItems, CurrentVariableTable); - - if (res) - { - _notificationService.ShowSuccess($"从OPC UA服务器导入变量成功,共导入变量:{importedVariableItems.Count}个"); - } - else - { - _notificationService.ShowError("从OPC UA服务器导入变量失败"); - } - } - else + if (!importedVariableItems.Any()) { _notificationService.ShowSuccess("列表中没有要添加的变量了。"); + return; } + var resList = await _variableViewService.AddAsync(importedVariableItems, CurrentVariableTable); + + if (resList is null || !resList.Any()) + { + _notificationService.ShowError("从OPC UA服务器导入变量失败"); + return; + } + + _variableItemList.AddRange(resList); + + _notificationService.ShowSuccess($"从OPC UA服务器导入变量成功,共导入变量:{importedVariableItems.Count}个"); } catch (Exception e) { @@ -381,7 +368,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// 此命令通常绑定到UI中的"添加"按钮。 /// 当前操作的变量表,用于设置新变量的所属ID。 [RelayCommand] - private async void AddVariable() + private async Task AddVariable() { try { @@ -394,28 +381,28 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable variableDialogViewModel.PrimaryButText = "添加变量"; variableDialogViewModel.Variable = variableItem; - var variableItemViewModel = await _dialogService.ShowDialogAsync(variableDialogViewModel); + var conVariableItem = await _dialogService.ShowDialogAsync(variableDialogViewModel); // 如果用户取消或对话框未返回数据,则直接返回 - if (variableItemViewModel == null) + if (conVariableItem == null) return; - // // 设置新变量的所属变量表ID - variableItemViewModel.VariableTableId = CurrentVariableTable.Id; - variableItemViewModel.CreatedAt = DateTime.Now; - variableItemViewModel.UpdatedAt = DateTime.Now; - // // 添加变量数据到数据库 - var addVariable - = await _variableManagementService.CreateVariableAsync(_mapper.Map(variableItemViewModel)); - _mapper.Map(addVariable, variableItemViewModel); + var resList + = await _variableViewService.AddAsync(new List() { conVariableItem }, CurrentVariableTable); + if (resList is null || !resList.Any()) + { + _notificationService.ShowError("添加变量失败"); + return; + } + // // 更新当前页面显示的数据:将新变量添加到集合中 - _variableItemList.Add(variableItemViewModel); - _viewCenterService.VariableDataService.AddVariable(variableItemViewModel); + _variableItemList.Add(variableItem); + _viewCenterService.VariableDataService.AddVariable(variableItem); // // // 显示成功通知 - _notificationService.ShowSuccess($"添加变量成功:{variableItemViewModel.Name}"); + _notificationService.ShowSuccess($"添加变量成功:{variableItem.Name}"); } catch (Exception e) { @@ -447,25 +434,22 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable var names = string.Join("、", variablesToDelete.Select(v => v.Name)); // 显示确认删除对话框 - ConfirmDialogViewModel confirmDialogViewModel - = new ConfirmDialogViewModel("删除变量", $"确认要删除变量:{names},删除后不可恢复,确认要删除吗?", "删除变量"); - var isDel = await _dialogService.ShowDialogAsync(confirmDialogViewModel); + string message = $"确认要删除变量:{names},删除后不可恢复,确认要删除吗?"; + var viewModel + = new ConfirmDialogViewModel("删除变量", message, "删除变量"); + // 如果用户取消删除,则返回 + if (!await _dialogService.ShowDialogAsync(viewModel)) return; + - if (!isDel) - return; // 如果用户取消删除,则返回 - - // 从数据库中删除变量数据 - var result = await _viewCenterService.VariableDataService.DeleteAsync(variablesToDelete); + var result = await _variableViewService.DeleteAsync(variablesToDelete); if (result) { - foreach (var variable in variablesToDelete) + foreach (VariableItem item in variablesToDelete) { - _variableItemList.Remove(variable); - _viewCenterService.VariableDataService.DeleteVariable(variable.Id); + _variableItemList.Remove(item); } - // 显示成功通知 _notificationService.ShowSuccess($"成功删除 {variablesToDelete.Count} 个变量"); } @@ -615,7 +599,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable // 为每个变量分配MQTT别名 foreach (var editedVariableMqtt in editedVariableMqtts) { - var mqttAliasItem = await _viewCenterService.MqttAliasDataService.AssignAliasAsync(editedVariableMqtt); + var mqttAliasItem = await _viewCenterService.MqttAliasDataService.AssignAliasAsync(editedVariableMqtt); if (mqttAliasItem is not null) { totalAffectedCount++; @@ -909,21 +893,15 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable public override async Task OnNavigatedToAsync(NavigationParameter parameter) { - if (_viewDataService.VariableTables.TryGetValue(parameter.TargetId, out var varTable)) - { - CurrentVariableTable = varTable; - // 根据变量表的协议类型设置对应的布尔属性 + if (!_viewDataService.VariableTables.TryGetValue(parameter.TargetId, out var varTable)) + return; - if (CurrentVariableTable.Protocol == ProtocolType.S7) - { - IsS7ProtocolSelected = true; - } - else if (CurrentVariableTable.Protocol == ProtocolType.OpcUa) - { - IsOpcUaProtocolSelected = true; - } - - OnLoaded(); - } + CurrentVariableTable = varTable; + // 根据变量表的协议类型设置对应的布尔属性 + IsS7ProtocolSelected = CurrentVariableTable.Protocol == ProtocolType.S7 ? true : false; + IsOpcUaProtocolSelected = CurrentVariableTable.Protocol == ProtocolType.OpcUa ? true : false; + //添加变量 + _variableItemList.Clear(); + _variableItemList.AddRange(CurrentVariableTable.Variables); } } \ No newline at end of file diff --git a/DMS.WPF/Views/Dialogs/ImportExcelDialog.xaml b/DMS.WPF/Views/Dialogs/ImportExcelDialog.xaml index d14e344..8efa9ec 100644 --- a/DMS.WPF/Views/Dialogs/ImportExcelDialog.xaml +++ b/DMS.WPF/Views/Dialogs/ImportExcelDialog.xaml @@ -80,7 +80,7 @@ + Binding="{Binding DataType}" /> diff --git a/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml b/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml index 7aa8085..f7ce6a2 100644 --- a/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml +++ b/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml @@ -124,7 +124,7 @@ - + diff --git a/DMS.WPF/Views/Dialogs/VariableDialog.xaml b/DMS.WPF/Views/Dialogs/VariableDialog.xaml index 685f42f..be79ffc 100644 --- a/DMS.WPF/Views/Dialogs/VariableDialog.xaml +++ b/DMS.WPF/Views/Dialogs/VariableDialog.xaml @@ -24,7 +24,7 @@ - + @@ -160,8 +160,8 @@ Margin="0,15,0,0" hc:InfoElement.Title="数据类型:" IsEnabled="{Binding IsAddModel}" - ItemsSource="{Binding Source={StaticResource CSharpDataType}}" - SelectedItem="{Binding Variable.CSharpDataType, UpdateSourceTrigger=PropertyChanged}"> + ItemsSource="{Binding Source={StaticResource DataType}}" + SelectedItem="{Binding Variable.DataType, UpdateSourceTrigger=PropertyChanged}">