From 3dee207b8875430c32a03c91ef388e41b9bdd280 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Sun, 24 Aug 2025 14:42:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B7=BB=E5=8A=A0=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=AF=B9=E8=AF=9D=E6=A1=86=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interfaces/IVariableAppService.cs | 7 + .../Services/VariableAppService.cs | 15 + DMS.WPF/App.xaml.cs | 1 + .../Dialogs/MqttSelectionDialogViewModel.cs | 4 +- .../Dialogs/VariableDialogViewModel.cs | 108 ++++- DMS.WPF/ViewModels/MainViewModel.cs | 2 +- DMS.WPF/ViewModels/MqttsViewModel.cs | 4 +- DMS.WPF/ViewModels/VariableTableViewModel.cs | 54 +-- DMS.WPF/Views/Dialogs/VariableDialog.xaml | 46 +- DMS.WPF/Views/Dialogs/VariableDialog.xaml.cs | 19 +- DMS.WPF/Views/VariableTableView.xaml | 397 ++++++++---------- 11 files changed, 369 insertions(+), 288 deletions(-) diff --git a/DMS.Application/Interfaces/IVariableAppService.cs b/DMS.Application/Interfaces/IVariableAppService.cs index ad46287..398a79a 100644 --- a/DMS.Application/Interfaces/IVariableAppService.cs +++ b/DMS.Application/Interfaces/IVariableAppService.cs @@ -43,4 +43,11 @@ public interface IVariableAppService /// 要检查的变量列表。 /// 返回输入列表中已存在的变量。 Task> FindExistingVariablesAsync(IEnumerable variablesToCheck); + + /// + /// 检测单个变量是否已存在。 + /// + /// 要检查的变量。 + /// 如果变量已存在则返回该变量,否则返回null。 + Task FindExistingVariableAsync(VariableDto variableToCheck); } \ No newline at end of file diff --git a/DMS.Application/Services/VariableAppService.cs b/DMS.Application/Services/VariableAppService.cs index e582a4d..deb73b1 100644 --- a/DMS.Application/Services/VariableAppService.cs +++ b/DMS.Application/Services/VariableAppService.cs @@ -176,4 +176,19 @@ public class VariableAppService : IVariableAppService return result; } + + public async Task FindExistingVariableAsync(VariableDto variableToCheck) + { + if (variableToCheck == null) + { + return null; + } + + // 创建一个包含单个元素的列表以便复用现有的逻辑 + var variablesToCheck = new List { variableToCheck }; + var existingVariables = await FindExistingVariablesAsync(variablesToCheck); + + // 如果找到了匹配的变量,返回第一个(也是唯一一个) + return existingVariables.FirstOrDefault(); + } } \ No newline at end of file diff --git a/DMS.WPF/App.xaml.cs b/DMS.WPF/App.xaml.cs index 7caf633..019c3fc 100644 --- a/DMS.WPF/App.xaml.cs +++ b/DMS.WPF/App.xaml.cs @@ -182,6 +182,7 @@ public partial class App : System.Windows.Application services.AddSingleton(); // 注册对话框模型 services.AddTransient(); + services.AddTransient(); // 注册对话框 services.AddSingleton(); //注册View视图 diff --git a/DMS.WPF/ViewModels/Dialogs/MqttSelectionDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/MqttSelectionDialogViewModel.cs index 72d88d0..0efb25d 100644 --- a/DMS.WPF/ViewModels/Dialogs/MqttSelectionDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/MqttSelectionDialogViewModel.cs @@ -13,9 +13,9 @@ public partial class MqttSelectionDialogViewModel : ObservableObject // [ObservableProperty] // private Mqtt? selectedMqtt; // - // public MqttSelectionDialogViewModel(DataServices dataServices) + // public MqttSelectionDialogViewModel(DataServices _dataServices) // { - // Mqtts = new ObservableCollection(dataServices.Mqtts); + // Mqtts = new ObservableCollection(_dataServices.Mqtts); // } diff --git a/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs index c2a22dc..e16be81 100644 --- a/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs @@ -1,5 +1,10 @@ +using AutoMapper; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using DMS.Application.DTOs; +using DMS.Application.Interfaces; +using DMS.Helper; +using DMS.WPF.Services; using DMS.WPF.ViewModels.Items; namespace DMS.WPF.ViewModels.Dialogs; @@ -9,26 +14,97 @@ public partial class VariableDialogViewModel : DialogViewModelBase PrimaryButtonAsync() { - Close(Variable); + // 清除之前的错误信息 + ErrorMessage = string.Empty; + HasError = false; + // 验证输入 + bool isValid = ValidateInputAsync(); + if (isValid) + { + Close(Variable); + } + + return isValid; } + + private bool ValidateInputAsync() + { + // 检查变量名称是否为空 + if (string.IsNullOrWhiteSpace(Variable.Name)) + { + ErrorMessage = "变量名称不能为空"; + HasError = true; + return false; + } + + // 根据协议类型检查地址 + if (Variable.Protocol == Core.Enums.ProtocolType.S7 && + string.IsNullOrWhiteSpace(Variable.S7Address)) + { + ErrorMessage = "S7协议必须填写S7地址"; + HasError = true; + return false; + } + + if (Variable.Protocol == Core.Enums.ProtocolType.OpcUa && + string.IsNullOrWhiteSpace(Variable.OpcUaNodeId)) + { + ErrorMessage = "OPC UA协议必须填写节点ID"; + HasError = true; + return false; + } + //检查变量是否存在 + var existVariable = _dataServices.Variables.FirstOrDefault(v => v.Name == Variable.Name || v.S7Address == Variable.S7Address || v.OpcUaNodeId == Variable.OpcUaNodeId); + if (existVariable != null) + { + + if (Variable.Name == existVariable.Name) + { + ErrorMessage = $"变量名称:{existVariable.Name}已经存在。"; + HasError = true; + return false; + } + + if (Variable.Protocol == Core.Enums.ProtocolType.S7 && Variable.S7Address == existVariable.S7Address) + { + ErrorMessage = $"变量S7地址:{existVariable.S7Address}已经存在。"; + HasError = true; + return false; + } + + if (Variable.Protocol == Core.Enums.ProtocolType.OpcUa && Variable.OpcUaNodeId == existVariable.OpcUaNodeId) + { + ErrorMessage = $"变量OpcUa节点ID:{existVariable.OpcUaNodeId}已经存在。"; + HasError = true; + return false; + } + + } + + return true; + } + [RelayCommand] private void CancleButton() { diff --git a/DMS.WPF/ViewModels/MainViewModel.cs b/DMS.WPF/ViewModels/MainViewModel.cs index ea28b1c..a67b42f 100644 --- a/DMS.WPF/ViewModels/MainViewModel.cs +++ b/DMS.WPF/ViewModels/MainViewModel.cs @@ -62,7 +62,7 @@ public partial class MainViewModel : ViewModelBase // 发送消息加载数据 MessageHelper.SendLoadMessage(LoadTypes.All); // 当菜单加载成功后,在前台显示菜单 - // dataServices.OnMenuTreeListChanged += (menus) => { Menus = new ObservableCollection(menus); }; + // _dataServices.OnMenuTreeListChanged += (menus) => { Menus = new ObservableCollection(menus); }; } /// diff --git a/DMS.WPF/ViewModels/MqttsViewModel.cs b/DMS.WPF/ViewModels/MqttsViewModel.cs index 444ae82..7dcba97 100644 --- a/DMS.WPF/ViewModels/MqttsViewModel.cs +++ b/DMS.WPF/ViewModels/MqttsViewModel.cs @@ -57,13 +57,13 @@ public partial class MqttsViewModel : ViewModelBase _dialogService = dialogService; _dataServices = dataServices; - // if (dataServices.Mqtts == null || dataServices.Mqtts.Count == 0) + // if (_dataServices.Mqtts == null || _dataServices.Mqtts.Count == 0) // { // MessageHelper.SendLoadMessage(LoadTypes.Mqtts); // } // else // { - // Mqtts = new ObservableCollection(dataServices.Mqtts); + // Mqtts = new ObservableCollection(_dataServices.Mqtts); // } // // diff --git a/DMS.WPF/ViewModels/VariableTableViewModel.cs b/DMS.WPF/ViewModels/VariableTableViewModel.cs index 865b675..f391521 100644 --- a/DMS.WPF/ViewModels/VariableTableViewModel.cs +++ b/DMS.WPF/ViewModels/VariableTableViewModel.cs @@ -483,65 +483,29 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable // /// /// 添加新的变量数据。 - /// 此命令通常绑定到UI中的“添加”按钮。 /// + /// 此命令通常绑定到UI中的“添加”按钮。 /// 当前操作的变量表,用于设置新变量的所属ID。 [RelayCommand] - private async void AddVariable(VariableTable variableTable) + private async void AddVariable() { try { // 显示添加变量数据的对话框 - VariableDialogViewModel variableDialogViewModel=new VariableDialogViewModel("添加变量","添加变量"); - + VariableDialogViewModel variableDialogViewModel=App.Current.Services.GetRequiredService(); + variableDialogViewModel.Title = "添加变量"; + variableDialogViewModel.PrimaryButText = "添加变量"; var variableItemViewModel = await _dialogService.ShowDialogAsync(variableDialogViewModel); // 如果用户取消或对话框未返回数据,则直接返回 if (variableItemViewModel == null) return; - + // // 设置新变量的所属变量表ID - // varData.VariableTableId = variableTable.Id; - // - // // --- 重复性检查逻辑开始 --- - // bool isDuplicate = false; - // string duplicateReason = string.Empty; - // - // // 检查名称是否重复 - // if (Variables.Any(v => v.Name == varData.Name)) - // { - // isDuplicate = true; - // duplicateReason = $"名称 '{varData.Name}' 已存在。"; - // } - // else - // { - // // 根据协议类型检查S7地址或NodeId是否重复 - // if (variableTable.ProtocolType == ProtocolType.S7) - // { - // if (!string.IsNullOrEmpty(varData.S7Address) && - // Variables.Any(v => v.S7Address == varData.S7Address)) - // { - // isDuplicate = true; - // duplicateReason = $"S7地址 '{varData.S7Address}' 已存在。"; - // } - // } - // else if (variableTable.ProtocolType == ProtocolType.OpcUA) - // { - // if (!string.IsNullOrEmpty(varData.NodeId) && Variables.Any(v => v.NodeId == varData.NodeId)) - // { - // isDuplicate = true; - // duplicateReason = $"OPC UA NodeId '{varData.NodeId}' 已存在。"; - // } - // } - // } - // - // if (isDuplicate) - // { - // NotificationHelper.ShowError($"添加变量失败:{duplicateReason}"); - // return; - // } - // // --- 重复性检查逻辑结束 --- + variableItemViewModel.VariableTableId = CurrentVariableTable.Id; + + // // // 添加变量数据到数据库 // var resVarData = await _varDataRepository.AddAsync(varData); diff --git a/DMS.WPF/Views/Dialogs/VariableDialog.xaml b/DMS.WPF/Views/Dialogs/VariableDialog.xaml index 11c7e89..c76aad8 100644 --- a/DMS.WPF/Views/Dialogs/VariableDialog.xaml +++ b/DMS.WPF/Views/Dialogs/VariableDialog.xaml @@ -15,8 +15,7 @@ d:DataContext="{d:DesignInstance vmd:VariableDialogViewModel}" CloseButtonCommand="{Binding CancleButtonCommand}" CloseButtonText="取消" - DefaultButton="Primary" - PrimaryButtonCommand="{Binding PrimaryButtonCommand}" + PrimaryButtonClick="ContentDialog_PrimaryButtonClick" PrimaryButtonText="{Binding PrimaryButText}" mc:Ignorable="d"> @@ -26,10 +25,34 @@ + + + + + + + + + @@ -53,7 +76,7 @@ hc:InfoElement.Title="变量名称:" Text="{Binding Variable.Name, UpdateSourceTrigger=PropertyChanged}" /> - + - - - - - - - + + + + - + - + - + - + - + @@ -107,132 +95,133 @@ - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + @@ -244,27 +233,18 @@ - - - - + + + + - - + + - - - + + + @@ -272,26 +252,26 @@ - - - - - - - - - + + + + + + + + + @@ -299,8 +279,7 @@ - + @@ -310,18 +289,15 @@ - + - + - + @@ -331,34 +307,31 @@ - - - - - - - - - - - - + + + + + + + + + + + +