1 feat: 优化MQTT服务器详情页面功能

2
    3 - 修改MQTT发布处理器,使用DisplayValue代替DataValue进行数据发布
    4 - 在MqttServiceManager中使用DisplayValue进行消息内容替换
    5 - 增加MQTT服务器编辑功能,允许用户修改服务器配置
    6 - 添加变量MQTT发布别名修改功能,支持右键菜单修改发布名称
    7 - 实现变量值变化事件监听,实时更新UI显示
    8 - 优化MQTT服务器详情页面UI,改进变量关联数据显示
    9 - 修复变量表关联MQTT服务器时的逻辑问题
   10 - 完善导航生命周期事件处理
This commit is contained in:
2025-10-05 19:57:58 +08:00
parent 7a2b67991c
commit 1f0495fbe7
6 changed files with 173 additions and 15 deletions

View File

@@ -43,7 +43,7 @@ public class MqttPublishProcessor : IVariableProcessor
// 发布变量数据到MQTT服务器 // 发布变量数据到MQTT服务器
var variableMqttAlias = _mapper.Map<VariableMqttAlias>(variableMqttAliasDto); var variableMqttAlias = _mapper.Map<VariableMqttAlias>(variableMqttAliasDto);
variableMqttAlias.Variable.DataValue=variable.DataValue; variableMqttAlias.Variable.DisplayValue=variable.DisplayValue;
await _mqttServiceManager.PublishVariableDataAsync(variableMqttAlias); await _mqttServiceManager.PublishVariableDataAsync(variableMqttAlias);
} }
} }

View File

@@ -275,7 +275,7 @@ namespace DMS.Infrastructure.Services.Mqtt
var now = DateTime.Now; var now = DateTime.Now;
var timestamp = ((DateTimeOffset)now).ToUnixTimeMilliseconds(); var timestamp = ((DateTimeOffset)now).ToUnixTimeMilliseconds();
sb.Append(variableMqtt.MqttServer.MessageHeader.Replace("{timestamp}", timestamp.ToString())); sb.Append(variableMqtt.MqttServer.MessageHeader.Replace("{timestamp}", timestamp.ToString()));
sb.Append(variableMqtt.MqttServer.MessageContent.Replace("{name}", variableMqtt.Alias).Replace("{value}", variableMqtt.Variable.DataValue)); sb.Append(variableMqtt.MqttServer.MessageContent.Replace("{name}", variableMqtt.Alias).Replace("{value}", variableMqtt.Variable.DisplayValue));
sb.Append(variableMqtt.MqttServer.MessageFooter); sb.Append(variableMqtt.MqttServer.MessageFooter);
return sb.ToString(); return sb.ToString();

View File

@@ -1,8 +1,11 @@
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using DMS.Application.Events;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management; using DMS.Application.Interfaces.Management;
using DMS.Core.Models; using DMS.Core.Models;
using DMS.WPF.Interfaces; using DMS.WPF.Interfaces;
using DMS.WPF.ViewModels.Dialogs;
using DMS.WPF.ViewModels.Items; using DMS.WPF.ViewModels.Items;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@@ -18,7 +21,9 @@ namespace DMS.WPF.ViewModels
private readonly ILogger<MqttServerDetailViewModel> _logger; private readonly ILogger<MqttServerDetailViewModel> _logger;
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
private readonly INotificationService _notificationService; private readonly INotificationService _notificationService;
private readonly IEventService _eventService;
private readonly IMqttManagementService _mqttManagementService; private readonly IMqttManagementService _mqttManagementService;
private readonly IWPFDataService _wpfDataService;
private readonly IDataStorageService _dataStorageService; private readonly IDataStorageService _dataStorageService;
private readonly INavigationService _navigationService; private readonly INavigationService _navigationService;
@@ -47,20 +52,85 @@ namespace DMS.WPF.ViewModels
public MqttServerDetailViewModel(ILogger<MqttServerDetailViewModel> logger, public MqttServerDetailViewModel(ILogger<MqttServerDetailViewModel> logger,
IDialogService dialogService, IDialogService dialogService,
INotificationService notificationService, INotificationService notificationService,
IEventService eventService,
IMqttManagementService mqttManagementService, IMqttManagementService mqttManagementService,
IWPFDataService wpfDataService,
IDataStorageService dataStorageService, IDataStorageService dataStorageService,
INavigationService navigationService) INavigationService navigationService)
{ {
_logger = logger; _logger = logger;
_dialogService = dialogService; _dialogService = dialogService;
_notificationService = notificationService; _notificationService = notificationService;
this._eventService = eventService;
_mqttManagementService = mqttManagementService; _mqttManagementService = mqttManagementService;
this._wpfDataService = wpfDataService;
this._dataStorageService = dataStorageService; this._dataStorageService = dataStorageService;
_navigationService = navigationService; _navigationService = navigationService;
} }
/// <summary>
/// 编辑当前MQTT服务器
/// </summary>
[RelayCommand]
private async Task EditMqtt()
{
try
{
if (CurrentMqtt == null)
{
_notificationService.ShowError("没有选中的MQTT服务器无法编辑。");
return;
}
// 创建编辑对话框的视图模型
var mqttDialogViewModel = new MqttDialogViewModel(CurrentMqtt)
{
Title = "编辑MQTT服务器",
PrimaryButText = "保存修改"
};
// 显示对话框
var updatedMqtt = await _dialogService.ShowDialogAsync(mqttDialogViewModel);
if (updatedMqtt == null)
{
return; // 用户取消了编辑
}
// 更新MQTT服务器
var result = await _wpfDataService.MqttDataService.UpdateMqttServer(updatedMqtt);
if (result)
{
// 更新当前视图模型的数据
CurrentMqtt.ServerName = updatedMqtt.ServerName;
CurrentMqtt.ServerUrl = updatedMqtt.ServerUrl;
CurrentMqtt.Port = updatedMqtt.Port;
CurrentMqtt.ClientId = updatedMqtt.ClientId;
CurrentMqtt.Username = updatedMqtt.Username;
CurrentMqtt.Password = updatedMqtt.Password;
CurrentMqtt.PublishTopic = updatedMqtt.PublishTopic;
CurrentMqtt.SubscribeTopic = updatedMqtt.SubscribeTopic;
CurrentMqtt.MessageHeader = updatedMqtt.MessageHeader;
CurrentMqtt.MessageContent = updatedMqtt.MessageContent;
CurrentMqtt.MessageFooter = updatedMqtt.MessageFooter;
_notificationService.ShowSuccess($"MQTT服务器编辑成功{updatedMqtt.ServerName}");
}
else
{
_notificationService.ShowError("更新MQTT服务器失败。");
}
}
catch (Exception e)
{
_logger.LogError(e, "编辑MQTT服务器过程中发生错误");
_notificationService.ShowError($"编辑MQTT服务器过程中发生错误{e.Message}", e);
}
}
/// <summary> /// <summary>
/// 重新加载当前MQTT服务器数据 /// 重新加载当前MQTT服务器数据
/// </summary> /// </summary>
@@ -107,7 +177,81 @@ namespace DMS.WPF.ViewModels
CurrentMqtt = mqttServerItem; CurrentMqtt = mqttServerItem;
} }
_eventService.OnVariableValueChanged += OnVariableValueChanged;
return Task.CompletedTask;
}
private void OnVariableValueChanged(object? sender, VariableValueChangedEventArgs e)
{
var variableAlias=CurrentMqtt.VariableAliases.FirstOrDefault(v => v.Variable.Id == e.Variable.Id);
if (variableAlias is not null)
{
variableAlias.Variable.DisplayValue=e.Variable.DisplayValue;
variableAlias.Variable.UpdatedAt=e.Variable.UpdatedAt;
}
}
/// <summary>
/// 修改变量的MQTT发送名称
/// </summary>
[RelayCommand]
private async Task ModifyAlias(VariableMqttAlias variableAlias)
{
if (variableAlias == null)
{
_notificationService.ShowError("请选择要修改的变量项。");
return;
}
try
{
// 创建一个用于输入新名称的简单对话框
var oldAlias = variableAlias.Alias;
InputDialogViewModel viewModel = new InputDialogViewModel("修改发送名称", "请输入新的MQTT发送名称:", oldAlias);
var dialogResult = await _dialogService.ShowDialogAsync(viewModel);
if (dialogResult != null) // 用户没有取消操作
{
var newAlias = dialogResult.Trim();
if (string.IsNullOrEmpty(newAlias))
{
_notificationService.ShowWarn("发送名称不能为空。");
return;
}
// 更新变量的发送名称
variableAlias.Alias = newAlias;
// 保存更改到数据服务
var result = await _wpfDataService.UpdateMqttServer(CurrentMqtt);
if (result)
{
_notificationService.ShowSuccess($"变量 '{variableAlias.Variable.Name}' 的发送名称已更新为 '{newAlias}'");
}
else
{
_notificationService.ShowError("更新发送名称失败。");
// 如果更新失败,恢复原来的值
variableAlias.Alias = oldAlias;
}
}
}
catch (Exception e)
{
_logger.LogError(e, "修改变量发送名称时发生错误");
_notificationService.ShowError($"修改发送名称时发生错误:{e.Message}");
}
}
public override Task OnNavigatedFromAsync(NavigationParameter parameter)
{
_eventService.OnVariableValueChanged -= OnVariableValueChanged;
return Task.CompletedTask; return Task.CompletedTask;
} }

View File

@@ -185,6 +185,19 @@ public partial class MqttsViewModel : ViewModelBase
// 更新UI // 更新UI
_mapper.Map(mqtt, SelectedMqtt); _mapper.Map(mqtt, SelectedMqtt);
// 更新当前视图模型的数据
mqtt.ServerName = SelectedMqtt.ServerName;
mqtt.ServerUrl = SelectedMqtt.ServerUrl;
mqtt.Port = SelectedMqtt.Port;
mqtt.ClientId = SelectedMqtt.ClientId;
mqtt.Username = SelectedMqtt.Username;
mqtt.Password = SelectedMqtt.Password;
mqtt.PublishTopic = SelectedMqtt.PublishTopic;
mqtt.SubscribeTopic = SelectedMqtt.SubscribeTopic;
mqtt.MessageHeader = SelectedMqtt.MessageHeader;
mqtt.MessageContent = SelectedMqtt.MessageContent;
mqtt.MessageFooter = SelectedMqtt.MessageFooter;
_notificationService.ShowSuccess($"编辑MQTT服务器成功{mqtt.ServerName}"); _notificationService.ShowSuccess($"编辑MQTT服务器成功{mqtt.ServerName}");
} }
catch (Exception e) catch (Exception e)

View File

@@ -661,7 +661,8 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
MqttServer = selectedMqtt, MqttServer = selectedMqtt,
Variable = originalVariable Variable = originalVariable
}; };
// originalVariable.MqttAliases.Add(variableMqtt); originalVariable.MqttAliases.Add(variableMqtt);
selectedMqtt.VariableAliases.Add(variableMqtt);
} }
else else
{ {

View File

@@ -38,14 +38,8 @@
DefaultLabelPosition="Right" DefaultLabelPosition="Right"
IsOpen="False" IsOpen="False"
HorizontalAlignment="Right"> HorizontalAlignment="Right">
<!-- 重新加载 -->
<ui:AppBarButton Command="{Binding ReloadCommand}" Label="重新加载">
<ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Refresh}" />
</ui:AppBarButton.Icon>
</ui:AppBarButton>
<ui:AppBarButton x:Name="EditButton" Label="编辑"> <ui:AppBarButton x:Name="EditButton" Label="编辑" Command="{Binding EditMqttCommand}">
<ui:AppBarButton.Icon> <ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" />
</ui:AppBarButton.Icon> </ui:AppBarButton.Icon>
@@ -272,18 +266,24 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="关联变量" Style="{StaticResource SubtitleTextBlockStyle}" Margin="0,0,0,10"/> <TextBlock Grid.Row="0" Text="关联变量" Style="{StaticResource SubtitleTextBlockStyle}" Margin="0,0,0,10"/>
<DataGrid Grid.Row="1" x:Name="AssociatedVariablesDataGrid" <DataGrid Grid.Row="1" x:Name="AssociatedVariablesDataGrid"
ItemsSource="{Binding AssociatedVariables}" ItemsSource="{Binding CurrentMqtt.VariableAliases}"
AutoGenerateColumns="False" AutoGenerateColumns="False"
CanUserAddRows="False" CanUserAddRows="False"
CanUserDeleteRows="False" CanUserDeleteRows="False"
IsReadOnly="True" IsReadOnly="True"
SelectionMode="Extended"> SelectionMode="Extended">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="修改发送名称" Command="{Binding ModifyAliasCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=SelectedItems[0]}"/>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="设备名称" Binding="{Binding Variable.VariableTable.Device.Name}"/>
<DataGridTextColumn Header="变量表名称" Binding="{Binding Variable.VariableTable.Name}"/>
<DataGridTextColumn Header="变量名称" Binding="{Binding Variable.Name}"/> <DataGridTextColumn Header="变量名称" Binding="{Binding Variable.Name}"/>
<DataGridTextColumn Header="MQTT发送名称" Binding="{Binding MqttAlias}"/> <DataGridTextColumn Header="MQTT发送名称" Binding="{Binding Alias}"/>
<DataGridTextColumn Header="地址" Binding="{Binding Variable.S7Address}"/> <DataGridTextColumn Header="地址" Binding="{Binding Variable.S7Address}"/>
<DataGridTextColumn Header="数据类型" Binding="{Binding Variable.SignalType}"/> <DataGridTextColumn Header="数据类型" Binding="{Binding Variable.DataType}"/>
<DataGridTextColumn Header="当前值" Binding="{Binding Variable.DataValue}"/>
<DataGridTextColumn Header="显示值" Binding="{Binding Variable.DisplayValue}"/> <DataGridTextColumn Header="显示值" Binding="{Binding Variable.DisplayValue}"/>
<DataGridTextColumn Header="更新时间" Binding="{Binding Variable.UpdatedAt, StringFormat='yyyy-MM-dd HH:mm:ss'}"/> <DataGridTextColumn Header="更新时间" Binding="{Binding Variable.UpdatedAt, StringFormat='yyyy-MM-dd HH:mm:ss'}"/>
</DataGrid.Columns> </DataGrid.Columns>