refactor:重构了变量的导入和删除

This commit is contained in:
2025-10-25 20:56:23 +08:00
parent 125348486a
commit b59d3d38a7
8 changed files with 111 additions and 176 deletions

View File

@@ -174,6 +174,7 @@ public class VariableManagementService : IVariableManagementService
{ {
variable.VariableTable = variableTable; variable.VariableTable = variableTable;
variableTable.Variables.Add(variable); variableTable.Variables.Add(variable);
_appDataService.Variables.TryAdd(variable.Id,variable);
} }
} }
_eventService.RaiseBatchImportVariables(this, new BatchImportVariablesEventArgs(result)); _eventService.RaiseBatchImportVariables(this, new BatchImportVariablesEventArgs(result));

View File

@@ -16,29 +16,18 @@ public interface IVariableViewService
/// </summary> /// </summary>
void LoadAllVariables(); void LoadAllVariables();
/// <summary>
/// 添加变量表。
/// </summary>
Task<bool> AddVariableTableToView(VariableTable tableDto);
/// <summary>
/// 更新变量表。
/// </summary>
Task<bool> UpdateVariableTable(VariableTableItem variableTable);
/// <summary> /// <summary>
/// 添加变量。 /// 添加变量。
/// </summary> /// </summary>
void AddVariable(VariableItem variableItem); void AddVariable(VariableItem variableItem);
/// <summary>
/// 删除变量。
/// </summary>
void DeleteVariable(int id);
Task<bool> DeleteAsync(List<VariableItem> deleteList); Task<bool> DeleteAsync(List<VariableItem> deleteList);
List<VariableItem> CheckExistingVariables(List<VariableItem> importedVariables, DeviceItem device); List<VariableItem> CheckExistingVariables(List<VariableItem> importedVariables, DeviceItem device);
Task<bool> AddAsync(List<VariableItem> variableItems,VariableTableItem variableTable);
Task<List<VariableItem>> AddAsync(List<VariableItem> variableItems,VariableTableItem variableTable);
} }

View File

@@ -99,7 +99,7 @@ public partial class VariableItem : ObservableObject
/// 用于在界面上显示变量表的关联信息。 /// 用于在界面上显示变量表的关联信息。
/// </summary> /// </summary>
[ObservableProperty] [ObservableProperty]
private VariableTable _variableTable; private VariableTableItem _variableTable;
/// <summary> /// <summary>
/// 获取或设置与此变量关联的MQTT别名列表。 /// 获取或设置与此变量关联的MQTT别名列表。

View File

@@ -53,45 +53,6 @@ public class VariableViewService : IVariableViewService
} }
} }
/// <summary>
/// 添加变量表。
/// </summary>
public async Task<bool> 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<VariableTableItem>(tableDto);
device.VariableTables.Add(variableTableItem);
_viewDataService.VariableTables.TryAdd(variableTableItem.Id, variableTableItem);
}
return true;
}
/// <summary>
/// 更新变量表。
/// </summary>
public async Task<bool> UpdateVariableTable(VariableTableItem variableTableItem)
{
if (variableTableItem is null)
{
return false;
}
var variableTable = _mapper.Map<VariableTable>(variableTableItem);
if (await _appCenterService.VariableTableManagementService.UpdateAsync(variableTable) > 0)
{
// 更新数据库后会自动更新内存,无需额外操作
return true;
}
return false;
}
/// <summary> /// <summary>
@@ -110,7 +71,7 @@ public class VariableViewService : IVariableViewService
/// <summary> /// <summary>
/// 添加变量。 /// 添加变量。
/// </summary> /// </summary>
public async Task<bool> AddAsync(List<VariableItem> variableItems, VariableTableItem variableTable) public async Task<List<VariableItem>> AddAsync(List<VariableItem> variableItems, VariableTableItem variableTable)
{ {
foreach (var variableDto in variableItems) foreach (var variableDto in variableItems)
@@ -123,35 +84,17 @@ public class VariableViewService : IVariableViewService
var resVariables = await _variableManagementService.AddAsync(_mapper.Map<List<Variable>>(variableItems)); var resVariables = await _variableManagementService.AddAsync(_mapper.Map<List<Variable>>(variableItems));
List<VariableItem> resVariableItems = _mapper.Map<List<VariableItem>>(resVariables); List<VariableItem> resVariableItems = _mapper.Map<List<VariableItem>>(resVariables);
foreach (var variableItem in resVariableItems) foreach (var variableItem in resVariableItems)
{ {
_viewDataService.Variables.TryAdd(variableItem.Id, variableItem); _viewDataService.Variables.TryAdd(variableItem.Id, variableItem);
variableTable.Variables.Add(variableItem); variableTable.Variables.Add(variableItem);
variableItem.VariableTable = variableTable;
} }
return true; return resVariableItems;
} }
/// <summary>
/// 删除变量。
/// </summary>
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<bool> DeleteAsync(List<VariableItem> variableItems) public async Task<bool> DeleteAsync(List<VariableItem> variableItems)
{ {
@@ -163,8 +106,19 @@ public class VariableViewService : IVariableViewService
deleteList.Add(mVariable); 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) foreach (var item in importedVariables)
{ {
bool slelect = item.Name == variable.Name || item.S7Address == variable.S7Address || item.OpcUaNodeId == variable.OpcUaNodeId; var isExist = false;
if (slelect)
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); existList.Add(item);
} }

View File

@@ -172,14 +172,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
} }
} }
/// <summary>
/// 当视图加载完成时调用。
/// 初始化协议选择状态,加载变量数据,并创建原始数据的深拷贝备份。
/// </summary>
public override void OnLoaded()
{
_variableItemList.AddRange(CurrentVariableTable.Variables);
}
/// <summary> /// <summary>
@@ -188,7 +180,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
/// </summary> /// </summary>
/// <param name="variableTable">当前操作的变量表,用于更新其内部的变量数据。</param> /// <param name="variableTable">当前操作的变量表,用于更新其内部的变量数据。</param>
[RelayCommand] [RelayCommand]
private async void UpdateVariable() private async Task UpdateVariable()
{ {
try try
{ {
@@ -247,7 +239,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
/// 此命令通常绑定到UI中的"从TIA导入"按钮。 /// 此命令通常绑定到UI中的"从TIA导入"按钮。
/// </summary> /// </summary>
[RelayCommand] [RelayCommand]
private async void ImprotFromTiaVarTable() private async Task ImprotFromTiaVarTable()
{ {
try try
{ {
@@ -258,33 +250,29 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
if (improtVariableItems == null || improtVariableItems.Count == 0) return; if (improtVariableItems == null || improtVariableItems.Count == 0) return;
//bool flowControl = await CheckExist(improtVariableItems); bool flowControl = await CheckExist(improtVariableItems);
//if (!flowControl) if (!flowControl)
//{ {
// return; return;
//} }
//if (improtVariableDtos.Count != 0) // 如果还有变量需要导入,则执行导入操作
//{ if (!improtVariableItems.Any())
// var addVariableDtos = await _variableManagementService.AddAsync(improtVariableDtos); {
// if (addVariableDtos is { Count: > 0 }) _notificationService.ShowSuccess("列表中没有要添加的变量了。");
// { return;
// List<VariableItem> variableItemViewModels = _mapper.Map<List<VariableItem>>(addVariableDtos); }
var resList = await _variableViewService.AddAsync(improtVariableItems, CurrentVariableTable);
// _variableItemList.AddRange(variableItemViewModels); if (resList is null || !resList.Any())
// //更新数据中心 {
// foreach (var variableItemViewModel in variableItemViewModels) _notificationService.ShowError("从OPC UA服务器导入变量失败");
// { return;
// CurrentVariableTable.Variables.Add(variableItemViewModel);
// } }
_variableItemList.AddRange(resList);
_notificationService.ShowSuccess($"从TIA变量表导入变量成功共导入变量{improtVariableItems.Count}个");
// _notificationService.ShowSuccess($"从Excel导入变量成功共导入变量{improtVariableDtos.Count}个");
// }
//}
//else
//{
// _notificationService.ShowSuccess($"列表中没有要添加的变量了。 ");
//}
} }
catch (Exception e) catch (Exception e)
{ {
@@ -297,7 +285,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
/// 此命令通常绑定到UI中的"从OPC UA导入"按钮。 /// 此命令通常绑定到UI中的"从OPC UA导入"按钮。
/// </summary> /// </summary>
[RelayCommand] [RelayCommand]
private async void ImportFromOpcUaServer() private async Task ImportFromOpcUaServer()
{ {
try try
{ {
@@ -330,23 +318,22 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
} }
// 如果还有变量需要导入,则执行导入操作 // 如果还有变量需要导入,则执行导入操作
if (importedVariableItems.Any()) if (!importedVariableItems.Any())
{
var res = await _variableViewService.AddAsync(importedVariableItems, CurrentVariableTable);
if (res)
{
_notificationService.ShowSuccess($"从OPC UA服务器导入变量成功共导入变量{importedVariableItems.Count}个");
}
else
{
_notificationService.ShowError("从OPC UA服务器导入变量失败");
}
}
else
{ {
_notificationService.ShowSuccess("列表中没有要添加的变量了。"); _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) catch (Exception e)
{ {
@@ -381,7 +368,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
/// 此命令通常绑定到UI中的"添加"按钮。 /// 此命令通常绑定到UI中的"添加"按钮。
/// <param name="variableTable">当前操作的变量表用于设置新变量的所属ID。</param> /// <param name="variableTable">当前操作的变量表用于设置新变量的所属ID。</param>
[RelayCommand] [RelayCommand]
private async void AddVariable() private async Task AddVariable()
{ {
try try
{ {
@@ -394,28 +381,28 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
variableDialogViewModel.PrimaryButText = "添加变量"; variableDialogViewModel.PrimaryButText = "添加变量";
variableDialogViewModel.Variable = variableItem; variableDialogViewModel.Variable = variableItem;
var variableItemViewModel = await _dialogService.ShowDialogAsync(variableDialogViewModel); var conVariableItem = await _dialogService.ShowDialogAsync(variableDialogViewModel);
// 如果用户取消或对话框未返回数据,则直接返回 // 如果用户取消或对话框未返回数据,则直接返回
if (variableItemViewModel == null) if (conVariableItem == null)
return; return;
// // 设置新变量的所属变量表ID
variableItemViewModel.VariableTableId = CurrentVariableTable.Id;
variableItemViewModel.CreatedAt = DateTime.Now;
variableItemViewModel.UpdatedAt = DateTime.Now;
// // 添加变量数据到数据库 // // 添加变量数据到数据库
var addVariable var resList
= await _variableManagementService.CreateVariableAsync(_mapper.Map<Variable>(variableItemViewModel)); = await _variableViewService.AddAsync(new List<VariableItem>() { conVariableItem }, CurrentVariableTable);
_mapper.Map(addVariable, variableItemViewModel); if (resList is null || !resList.Any())
{
_notificationService.ShowError("添加变量失败");
return;
}
// // 更新当前页面显示的数据:将新变量添加到集合中 // // 更新当前页面显示的数据:将新变量添加到集合中
_variableItemList.Add(variableItemViewModel); _variableItemList.Add(variableItem);
_viewCenterService.VariableDataService.AddVariable(variableItemViewModel); _viewCenterService.VariableDataService.AddVariable(variableItem);
// //
// // 显示成功通知 // // 显示成功通知
_notificationService.ShowSuccess($"添加变量成功:{variableItemViewModel.Name}"); _notificationService.ShowSuccess($"添加变量成功:{variableItem.Name}");
} }
catch (Exception e) catch (Exception e)
{ {
@@ -447,25 +434,22 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
var names = string.Join("、", variablesToDelete.Select(v => v.Name)); var names = string.Join("、", variablesToDelete.Select(v => v.Name));
// 显示确认删除对话框 // 显示确认删除对话框
ConfirmDialogViewModel confirmDialogViewModel string message = $"确认要删除变量:{names},删除后不可恢复,确认要删除吗?";
= new ConfirmDialogViewModel("删除变量", $"确认要删除变量:{names},删除后不可恢复,确认要删除吗?", "删除变量"); var viewModel
var isDel = await _dialogService.ShowDialogAsync(confirmDialogViewModel); = new ConfirmDialogViewModel("删除变量", message, "删除变量");
// 如果用户取消删除,则返回
if (!isDel) if (!await _dialogService.ShowDialogAsync(viewModel)) return;
return; // 如果用户取消删除,则返回
// 从数据库中删除变量数据 // 从数据库中删除变量数据
var result = await _viewCenterService.VariableDataService.DeleteAsync(variablesToDelete); var result = await _variableViewService.DeleteAsync(variablesToDelete);
if (result) if (result)
{ {
foreach (var variable in variablesToDelete) foreach (VariableItem item in variablesToDelete)
{ {
_variableItemList.Remove(variable); _variableItemList.Remove(item);
_viewCenterService.VariableDataService.DeleteVariable(variable.Id);
} }
// 显示成功通知 // 显示成功通知
_notificationService.ShowSuccess($"成功删除 {variablesToDelete.Count} 个变量"); _notificationService.ShowSuccess($"成功删除 {variablesToDelete.Count} 个变量");
} }
@@ -909,21 +893,15 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
public override async Task OnNavigatedToAsync(NavigationParameter parameter) public override async Task OnNavigatedToAsync(NavigationParameter parameter)
{ {
if (_viewDataService.VariableTables.TryGetValue(parameter.TargetId, out var varTable)) if (!_viewDataService.VariableTables.TryGetValue(parameter.TargetId, out var varTable))
{ return;
CurrentVariableTable = varTable; CurrentVariableTable = varTable;
// 根据变量表的协议类型设置对应的布尔属性 // 根据变量表的协议类型设置对应的布尔属性
IsS7ProtocolSelected = CurrentVariableTable.Protocol == ProtocolType.S7 ? true : false;
if (CurrentVariableTable.Protocol == ProtocolType.S7) IsOpcUaProtocolSelected = CurrentVariableTable.Protocol == ProtocolType.OpcUa ? true : false;
{ //添加变量
IsS7ProtocolSelected = true; _variableItemList.Clear();
} _variableItemList.AddRange(CurrentVariableTable.Variables);
else if (CurrentVariableTable.Protocol == ProtocolType.OpcUa)
{
IsOpcUaProtocolSelected = true;
}
OnLoaded();
}
} }
} }

View File

@@ -80,7 +80,7 @@
<DataGridTextColumn Header="描述" <DataGridTextColumn Header="描述"
Binding="{Binding Description}" /> Binding="{Binding Description}" />
<DataGridTextColumn Header="数据类型" <DataGridTextColumn Header="数据类型"
Binding="{Binding CSharpDataType}" /> Binding="{Binding DataType}" />
<DataGridTextColumn Header="S7地址" <DataGridTextColumn Header="S7地址"
Binding="{Binding S7Address}" /> Binding="{Binding S7Address}" />
</DataGrid.Columns> </DataGrid.Columns>

View File

@@ -124,7 +124,7 @@
</DataGrid.Style> </DataGrid.Style>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" Header="名称" /> <DataGridTextColumn Binding="{Binding Name}" Header="名称" />
<DataGridTextColumn Binding="{Binding CSharpDataType}" Header="数据类型" /> <DataGridTextColumn Binding="{Binding DataType}" Header="数据类型" />
<DataGridTextColumn Binding="{Binding OpcUaNodeId}" Header="节点ID" /> <DataGridTextColumn Binding="{Binding OpcUaNodeId}" Header="节点ID" />
</DataGrid.Columns> </DataGrid.Columns>

View File

@@ -24,7 +24,7 @@
<valueConverts:EnumToStringConverter x:Key="EnumToStringConverter" /> <valueConverts:EnumToStringConverter x:Key="EnumToStringConverter" />
<ex:EnumBindingSource x:Key="ProtocolType" EnumType="{x:Type en:ProtocolType}" /> <ex:EnumBindingSource x:Key="ProtocolType" EnumType="{x:Type en:ProtocolType}" />
<ex:EnumBindingSource x:Key="SignalType" EnumType="{x:Type enums:SignalType}" /> <ex:EnumBindingSource x:Key="SignalType" EnumType="{x:Type enums:SignalType}" />
<ex:EnumBindingSource x:Key="CSharpDataType" EnumType="{x:Type enums:DataType}" /> <ex:EnumBindingSource x:Key="DataType" EnumType="{x:Type enums:DataType}" />
</ui:ContentDialog.Resources> </ui:ContentDialog.Resources>
<ScrollViewer VerticalScrollBarVisibility="Auto"> <ScrollViewer VerticalScrollBarVisibility="Auto">
@@ -160,8 +160,8 @@
Margin="0,15,0,0" Margin="0,15,0,0"
hc:InfoElement.Title="数据类型:" hc:InfoElement.Title="数据类型:"
IsEnabled="{Binding IsAddModel}" IsEnabled="{Binding IsAddModel}"
ItemsSource="{Binding Source={StaticResource CSharpDataType}}" ItemsSource="{Binding Source={StaticResource DataType}}"
SelectedItem="{Binding Variable.CSharpDataType, UpdateSourceTrigger=PropertyChanged}"> SelectedItem="{Binding Variable.DataType, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate> <ComboBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" /> <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" />