From e78a7981e11f337ebcbc81dd1dbceb98271eb92c Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Sat, 11 Oct 2025 19:56:59 +0800 Subject: [PATCH] =?UTF-8?q?=20=20=201=20feat:=20=E4=B8=BAMqttServerDetailV?= =?UTF-8?q?iew=E6=B7=BB=E5=8A=A0=E5=8F=96=E6=B6=88=E5=85=B3=E8=81=94?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=20=20=202=20=20=20=203=20-=20=E5=9C=A8Mqt?= =?UTF-8?q?tServerDetailView=E7=9A=84DataGrid=E5=8F=B3=E9=94=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E4=B8=AD=E6=B7=BB=E5=8A=A0"=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E5=85=B3=E8=81=94"=E9=80=89=E9=A1=B9=20=20=20=204=20-=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0UnassignAlias=E5=91=BD=E4=BB=A4=EF=BC=8C?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E7=94=A8=E6=88=B7=E4=BB=8EMQTT=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E5=8F=96=E6=B6=88=E5=85=B3=E8=81=94=E5=8F=98?= =?UTF-8?q?=E9=87=8F=20=20=20=205=20-=20=E4=BD=BF=E7=94=A8=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E5=AF=B9=E8=AF=9D=E6=A1=86=E4=BB=A5=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E8=AF=AF=E6=93=8D=E4=BD=9C=20=20=20=206=20-=20=E9=9B=86?= =?UTF-8?q?=E6=88=90=E7=8E=B0=E6=9C=89=E7=9A=84=E5=88=A0=E9=99=A4API?= =?UTF-8?q?=E6=9D=A5=E5=AE=9E=E9=99=85=E7=A7=BB=E9=99=A4=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E4=B8=8EMQTT=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=9A=84=E5=85=B3?= =?UTF-8?q?=E8=81=94=20=20=20=207=20-=20=E6=9B=B4=E6=96=B0UI=E4=BB=A5?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E7=94=A8=E6=88=B7=E5=8F=8D=E9=A6=88=20=20=20?= =?UTF-8?q?=208=20=20=20=209=20=E6=AD=A4=E5=8A=9F=E8=83=BD=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E7=94=A8=E6=88=B7=E9=80=9A=E8=BF=87=E5=8F=B3=E9=94=AE?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E8=BD=BB=E6=9D=BE=E5=8F=96=E6=B6=88MQTT?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E4=B8=8E=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E8=81=94=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Management/MqttAliasManagementService.cs | 52 ++++------------- DMS.WPF/Services/MqttAliasDataService.cs | 24 ++++---- .../ViewModels/MqttServerDetailViewModel.cs | 56 +++++++++++++++++++ DMS.WPF/Views/MqttServerDetailView.xaml | 3 + 4 files changed, 83 insertions(+), 52 deletions(-) diff --git a/DMS.Application/Services/Management/MqttAliasManagementService.cs b/DMS.Application/Services/Management/MqttAliasManagementService.cs index 16818fa..c39616a 100644 --- a/DMS.Application/Services/Management/MqttAliasManagementService.cs +++ b/DMS.Application/Services/Management/MqttAliasManagementService.cs @@ -32,15 +32,17 @@ public class MqttAliasManagementService : IMqttAliasManagementService // Add to cache if (_storageService.MqttServers.TryGetValue(newAlias.MqttServerId, out var server)) { + newAlias.MqttServer = server; server.VariableAliases.Add(newAlias); } // Add to cache if (_storageService.Variables.TryGetValue(newAlias.VariableId, out var variable)) { + newAlias.Variable = variable; variable.MqttAliases.Add(newAlias); } - + _storageService.MqttAliases.TryAdd(newAlias.Id, newAlias); _eventService.RaiseMqttAliasChanged(this, new MqttAliasChangedEventArgs(ActionChangeType.Added, newAlias)); } @@ -90,51 +92,19 @@ public class MqttAliasManagementService : IMqttAliasManagementService public async Task DeleteAsync(int id) { - var res = await DeleteBatchAsync(new List { id }); - return res > 0; - } + var result = await _appService.RemoveAliasAsync(id); + if (result == 0) return false; - public async Task DeleteBatchAsync(List ids) - { - int counter = 0; - foreach (var id in ids) + if (_storageService.MqttAliases.TryGetValue(id, out var mqttAlias)) { - if (!_storageService.MqttAliases.TryGetValue(id, out var mqttAlias)) - { - continue; - } - var variableId = mqttAlias.VariableId; - var mqttServerId = mqttAlias.MqttServerId; - - var result = await _appService.RemoveAliasAsync(id); - if (result == 0) continue; - - // Remove from cache - if (_storageService.MqttServers.TryGetValue(mqttServerId, out var server)) - { - var aliasToRemove = server.VariableAliases.FirstOrDefault(a => a.Id == id); - if (aliasToRemove != null) - { - server.VariableAliases.Remove(aliasToRemove); - - } - } - // Remove from cache - if (_storageService.Variables.TryGetValue(mqttServerId, out var variable)) - { - var aliasToRemove = variable.MqttAliases.FirstOrDefault(a => a.Id == id); - if (aliasToRemove != null) - { - variable.MqttAliases.Remove(aliasToRemove); - - } - } - + mqttAlias.MqttServer.VariableAliases.Remove(mqttAlias); + mqttAlias.Variable.MqttAliases.Remove(mqttAlias); + _storageService.MqttAliases.TryRemove(mqttAlias.Id,out _); _eventService.RaiseMqttAliasChanged( this, new MqttAliasChangedEventArgs(ActionChangeType.Deleted, mqttAlias)); - counter++; + } - return counter; + return true; } } \ No newline at end of file diff --git a/DMS.WPF/Services/MqttAliasDataService.cs b/DMS.WPF/Services/MqttAliasDataService.cs index 1607f51..27c5ce0 100644 --- a/DMS.WPF/Services/MqttAliasDataService.cs +++ b/DMS.WPF/Services/MqttAliasDataService.cs @@ -133,21 +133,23 @@ public class MqttAliasDataService : IMqttAliasDataService public async Task DeleteMqttAlias(MqttAliasItem mqttAlias) { // 从数据库和内存中删除MQTT别名 - var result = await _mqttAliasManagementService.UpdateAsync(new MqttAlias - { - Id = mqttAlias.Id, - VariableId = mqttAlias.VariableId, - MqttServerId = mqttAlias.MqttServerId, - Alias = null // Setting alias to null effectively removes the alias - }); + var result = await _mqttAliasManagementService.DeleteAsync(mqttAlias.Id); - if (result > 0) + if (result ) { - // 从界面删除MQTT别名 - _dataStorageService.MqttAliases.Remove(mqttAlias.Id); + + if (_dataStorageService.MqttServers.TryGetValue(mqttAlias.MqttServerId, out var mqttServerItem)) + { + mqttServerItem.VariableAliases.Remove(mqttAlias); + } + if (_dataStorageService.Variables.TryGetValue(mqttAlias.VariableId, out var variableItem)) + { + variableItem.MqttAliases.Remove(mqttAlias); + } + _dataStorageService.MqttAliases.Remove(mqttAlias.Id, out _); } - return result > 0; + return result; } /// diff --git a/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs b/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs index 4a2e7a3..4dc02d9 100644 --- a/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs +++ b/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs @@ -24,6 +24,7 @@ namespace DMS.WPF.ViewModels private readonly INotificationService _notificationService; private readonly IEventService _eventService; private readonly IMqttManagementService _mqttManagementService; + private readonly IMqttAliasDataService _mqttAliasDataService; private readonly IWPFDataService _wpfDataService; private readonly IDataStorageService _dataStorageService; private readonly INavigationService _navigationService; @@ -58,6 +59,7 @@ namespace DMS.WPF.ViewModels INotificationService notificationService, IEventService eventService, IMqttManagementService mqttManagementService, + IMqttAliasDataService mqttAliasDataService, IWPFDataService wpfDataService, IDataStorageService dataStorageService, INavigationService navigationService) @@ -67,6 +69,7 @@ namespace DMS.WPF.ViewModels _notificationService = notificationService; this._eventService = eventService; _mqttManagementService = mqttManagementService; + this._mqttAliasDataService = mqttAliasDataService; this._wpfDataService = wpfDataService; this._dataStorageService = dataStorageService; _navigationService = navigationService; @@ -259,6 +262,59 @@ namespace DMS.WPF.ViewModels _notificationService.ShowError($"修改发送名称时发生错误:{e.Message}"); } } + + /// + /// 取消关联变量 + /// + [RelayCommand] + private async Task UnassignAlias() + { + if (SelectedMqttAliaes.Count == 0) + { + _notificationService.ShowError("请选择要取消关联的变量项。"); + return; + } + + try + { + var mqttAliasItems= SelectedMqttAliaes.Cast().ToList(); + // 拼接要删除的变量名称,用于确认提示 + var names = string.Join("、", mqttAliasItems.Select(v => v.Alias)); + + // 显示确认删除对话框 + ConfirmDialogViewModel confirmDialogViewModel + = new ConfirmDialogViewModel("取消关联", $"确认要取消关联变量:{names}与MQTT服务器的关联吗,取消后不可恢复,确认要取消吗?", "取消关联"); + var isDel = await _dialogService.ShowDialogAsync(confirmDialogViewModel); + + if (!isDel) + return; // 如果用户取消删除,则返回 + + int successCount = 0; + + foreach (var mqttAliasItem in mqttAliasItems) + { + var deleteResult = await _mqttAliasDataService.DeleteMqttAlias(mqttAliasItem); + if (deleteResult) + { + successCount++; + } + } + + if (successCount > 0) + { + _notificationService.ShowSuccess($"成功取消关联:{successCount}个变量"); + } + else + { + _notificationService.ShowError("取消关联失败。"); + } + } + catch (Exception e) + { + _logger.LogError(e, "取消关联变量时发生错误"); + _notificationService.ShowError($"取消关联时发生错误:{e.Message}"); + } + } public override Task OnNavigatedFromAsync(NavigationParameter parameter) { diff --git a/DMS.WPF/Views/MqttServerDetailView.xaml b/DMS.WPF/Views/MqttServerDetailView.xaml index 1a0156f..d547753 100644 --- a/DMS.WPF/Views/MqttServerDetailView.xaml +++ b/DMS.WPF/Views/MqttServerDetailView.xaml @@ -439,6 +439,9 @@ Command="{Binding ModifyAliasCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=SelectedItems[0]}" Header="修改发送名称" /> +