给变量添加Mqtt服务器的功能

This commit is contained in:
2025-07-05 18:15:21 +08:00
parent 33bdc5e131
commit 6c37a4a927
10 changed files with 203 additions and 3 deletions

View File

@@ -52,7 +52,7 @@ public partial class App : Application
InitializeMenu() InitializeMenu()
.Await((e) => { NotificationHelper.ShowMessage($"初始化主菜单失败:{e.Message}"); }, .Await((e) => { NotificationHelper.ShowMessage($"初始化主菜单失败:{e.Message}"); },
() => { MessageHelper.SendLoadMessage(LoadTypes.Menu); }); () => { MessageHelper.SendLoadMessage(LoadTypes.Menu); });
Host.Services.GetRequiredService<GrowlNotificationService>();
MainWindow = Host.Services.GetRequiredService<MainView>(); MainWindow = Host.Services.GetRequiredService<MainView>();
MainWindow.Show(); MainWindow.Show();
} }

View File

@@ -1,5 +1,8 @@
using System.Collections; using System.Collections;
using System.Reflection; using System.Reflection;
using PMSWPF.Models;
using PMSWPF.Data.Entities;
using PMSWPF.Helper;
namespace PMSWPF.Extensions; namespace PMSWPF.Extensions;
@@ -60,6 +63,16 @@ public static class ObjectExtensions
PropertyInfo targetProperty = PropertyInfo targetProperty =
targetType.GetProperty(sourceProperty.Name, BindingFlags.Public | BindingFlags.Instance); targetType.GetProperty(sourceProperty.Name, BindingFlags.Public | BindingFlags.Instance);
// 特殊处理 Mqtt.ConnTime 和 DbMqtt.CreateTime 的映射
if (sourceProperty.Name == "ConnTime" && targetType == typeof(DbMqtt))
{
targetProperty = targetType.GetProperty("CreateTime", BindingFlags.Public | BindingFlags.Instance);
}
else if (sourceProperty.Name == "CreateTime" && targetType == typeof(Mqtt))
{
targetProperty = targetType.GetProperty("ConnTime", BindingFlags.Public | BindingFlags.Instance);
}
// 确保目标属性存在且可写 // 确保目标属性存在且可写
if (targetProperty != null && targetProperty.CanWrite) if (targetProperty != null && targetProperty.CanWrite)
{ {
@@ -78,7 +91,48 @@ public static class ObjectExtensions
// 场景 2: 属性类型不同,但可能是泛型 List<T> 类型 // 场景 2: 属性类型不同,但可能是泛型 List<T> 类型
else if (isTargetList && isSourceList) else if (isTargetList && isSourceList)
{ {
CopyGenericList(ttarget, sourceProperty, targetProperty, sourceValue); // 特殊处理 Mqtts 列表的复制
if (sourceProperty.Name == "Mqtts")
{
if (sourceType == typeof(VariableData) && targetType == typeof(DbVariableData))
{
// 从 VariableData (List<Mqtt>) 转换为 DbVariableData (List<DbMqtt>)
var sourceMqtts = sourceValue as List<Mqtt>;
if (sourceMqtts != null)
{
var targetMqtts = sourceMqtts.Select(m => m.CopyTo<DbMqtt>()).ToList();
targetProperty.SetValue(ttarget, targetMqtts);
}
else
{
targetProperty.SetValue(ttarget, null);
}
}
else if (sourceType == typeof(DbVariableData) && targetType == typeof(VariableData))
{
// 从 DbVariableData (List<DbMqtt>) 转换为 VariableData (List<Mqtt>)
var sourceDbMqtts = sourceValue as List<DbMqtt>;
if (sourceDbMqtts != null)
{
var targetMqtts = sourceDbMqtts.Select(m => m.CopyTo<Mqtt>()).ToList();
targetProperty.SetValue(ttarget, targetMqtts);
}
else
{
targetProperty.SetValue(ttarget, null);
}
}
else
{
// 其他 List<T> 类型,使用通用复制逻辑
CopyGenericList(ttarget, sourceProperty, targetProperty, sourceValue);
}
}
else
{
// 其他 List<T> 类型,使用通用复制逻辑
CopyGenericList(ttarget, sourceProperty, targetProperty, sourceValue);
}
} }
// 场景 3: 属性类型不同,但是属性名称一样 // 场景 3: 属性类型不同,但是属性名称一样
else else

View File

@@ -171,4 +171,16 @@ public class DialogService :IDialogService
} }
return null; return null;
} }
public async Task<Mqtt?> ShowMqttSelectionDialog()
{
var vm = new MqttSelectionDialogViewModel();
var dialog = new MqttSelectionDialog(vm);
var result = await dialog.ShowAsync();
if (result == ContentDialogResult.Primary)
{
return vm.SelectedMqtt;
}
return null;
}
} }

View File

@@ -21,5 +21,5 @@ public interface IDialogService
Task<string> ShowImportExcelDialog(); Task<string> ShowImportExcelDialog();
ContentDialog ShowProcessingDialog(string title, string message); ContentDialog ShowProcessingDialog(string title, string message);
Task<PollLevelType?> ShowPollLevelDialog(PollLevelType pollLevelType); Task<PollLevelType?> ShowPollLevelDialog(PollLevelType pollLevelType);
Task<Mqtt?> ShowMqttSelectionDialog();
} }

View File

@@ -0,0 +1,41 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using PMSWPF.Models;
using PMSWPF.Data.Repositories;
using System.Threading.Tasks;
namespace PMSWPF.ViewModels.Dialogs;
public partial class MqttSelectionDialogViewModel : ObservableObject
{
private readonly MqttRepository _mqttRepository;
[ObservableProperty]
private ObservableCollection<Mqtt> mqtts;
[ObservableProperty]
private Mqtt? selectedMqtt;
public MqttSelectionDialogViewModel()
{
_mqttRepository = new MqttRepository();
LoadMqtts();
}
private async void LoadMqtts()
{
try
{
var allMqtts = await _mqttRepository.GetAll();
Mqtts = new ObservableCollection<Mqtt>(allMqtts);
}
catch (Exception ex)
{
// 这里需要一个日志记录器但由于ViewModel中没有直接注入ILogger
// 暂时使用Console.WriteLine或NotificationHelper
// 更好的做法是注入ILogger或使用静态日志类
Console.WriteLine($"加载MQTT服务器列表失败: {ex.Message}");
// 或者使用NotificationHelper.ShowMessage("加载MQTT服务器列表失败", NotificationType.Error);
}
}
}

View File

@@ -62,6 +62,7 @@ public partial class MqttsViewModel : ViewModelBase
} }
await _mqttRepository.Add(mqtt); await _mqttRepository.Add(mqtt);
MessageHelper.SendLoadMessage(LoadTypes.Mqtts);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@@ -282,6 +282,48 @@ partial class VariableTableViewModel : ViewModelBase
} }
} }
[RelayCommand]
public async Task AddMqttServerToVariables(IList<VariableData> variablesToAddMqtt)
{
if (variablesToAddMqtt == null || !variablesToAddMqtt.Any())
{
NotificationHelper.ShowMessage("请选择要添加MQTT服务器的变量", NotificationType.Warning);
return;
}
try
{
var selectedMqtt = await _dialogService.ShowMqttSelectionDialog();
if (selectedMqtt == null)
{
return; // 用户取消选择
}
foreach (VariableData variable in variablesToAddMqtt)
{
if (variable.Mqtts == null)
{
variable.Mqtts = new List<Mqtt>();
}
// 避免重复添加
if (!variable.Mqtts.Any(m => m.Id == selectedMqtt.Id))
{
variable.Mqtts.Add(selectedMqtt);
variable.IsModified = true; // 标记为已修改
}
}
// 批量更新数据库
await _varDataRepository.UpdateAsync(variablesToAddMqtt.ToList());
NotificationHelper.ShowMessage($"已成功为 {variablesToAddMqtt.Count} 个变量添加MQTT服务器: {selectedMqtt.Name}", NotificationType.Success);
}
catch (Exception ex)
{
Logger.Error(ex, "添加MQTT服务器到变量时发生错误。");
NotificationHelper.ShowMessage($"添加MQTT服务器失败: {ex.Message}", NotificationType.Error);
}
}
// [RelayCommand] // [RelayCommand]
// private async void ImportFromExcel() // private async void ImportFromExcel()
// { // {

View File

@@ -0,0 +1,21 @@
<controls:ContentDialog x:Class="PMSWPF.Views.Dialogs.MqttSelectionDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:PMSWPF.ViewModels.Dialogs"
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
xmlns:controls="http://schemas.inkore.net/lib/ui/wpf/modern"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance vm:MqttSelectionDialogViewModel}"
Title="选择MQTT服务器"
PrimaryButtonText="确定"
SecondaryButtonText="取消"
PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
SecondaryButtonClick="ContentDialog_SecondaryButtonClick">
<Grid>
<ListBox ItemsSource="{Binding Mqtts}"
SelectedItem="{Binding SelectedMqtt}"
DisplayMemberPath="Name" />
</Grid>
</controls:ContentDialog>

View File

@@ -191,6 +191,12 @@
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" />
</MenuItem.Icon> </MenuItem.Icon>
</MenuItem> </MenuItem>
<MenuItem Header="添加MQTT服务器"
Click="AddMqttServerToVariables_Click">
<MenuItem.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Add}" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu> </ContextMenu>
</DataGrid.ContextMenu> </DataGrid.ContextMenu>
<DataGrid.RowStyle> <DataGrid.RowStyle>

View File

@@ -145,4 +145,27 @@ public partial class VariableTableView : UserControl
NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error); NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error);
} }
} }
private async void AddMqttServerToVariables_Click(object sender, RoutedEventArgs e)
{
try
{
_viewModel = (VariableTableViewModel)this.DataContext;
var selectedVariables = BasicGridView.SelectedItems.Cast<VariableData>().ToList();
if (selectedVariables.Any())
{
await _viewModel.AddMqttServerToVariables(selectedVariables);
}
else
{
NotificationHelper.ShowMessage("请选择要添加MQTT服务器的变量", NotificationType.Warning);
}
}
catch (Exception ex)
{
string msg = "添加MQTT服务器时发生了错误";
Logger.Error(msg + ex);
NotificationHelper.ShowMessage(msg + ex.Message, NotificationType.Error);
}
}
} }