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 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-