重构触发器与变量关联关系的实现

This commit is contained in:
2025-10-20 18:54:43 +08:00
parent 252a99d586
commit 01adc11be7
8 changed files with 31 additions and 26 deletions

View File

@@ -5,6 +5,7 @@ namespace DMS.Infrastructure.Entities;
/// <summary>
/// 数据库实体:表示触发器与变量的多对多关联关系。
/// </summary>
[SugarTable("TriggerVariables")]
public class DbTriggerVariable
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]

View File

@@ -73,6 +73,6 @@ namespace DMS.WPF.ItemViewModel
/// <summary>
/// 关联的变量 ID 列表
/// </summary>
public ObservableCollection<int> VariableIds { get; } = new ObservableCollection<int>();
public ObservableCollection<VariableItem> Variables { get; } = new ObservableCollection<VariableItem>();
}
}

View File

@@ -107,6 +107,12 @@ public partial class VariableItem : ObservableObject
/// </summary>
[ObservableProperty]
private List<MqttAliasItem> _mqttAliases=new List<MqttAliasItem>();
/// <summary>
/// 获取或设置与此变量关联的触发器列表。
/// 一个变量可以有多个触发器。
/// </summary>
[ObservableProperty]
private List<TriggerItem> _triggers=new List<TriggerItem>();
/// <summary>
/// 获取或设置变量的信号类型 (如AI, DI, AO, DO)。

View File

@@ -1,9 +1,9 @@
using AutoMapper;
using DMS.Application.DTOs;
using DMS.Core.Models;
using DMS.Core.Models.Triggers;
using DMS.Infrastructure.Models;
using DMS.WPF.ItemViewModel;
using DMS.WPF.ItemViewModel;
namespace DMS.WPF.Profiles
{
@@ -15,6 +15,7 @@ namespace DMS.WPF.Profiles
.ReverseMap();
CreateMap<Variable, VariableItem>()
.ForMember(dest => dest.MqttAliases, opt => opt.Ignore())
.ForMember(dest => dest.Triggers, opt => opt.Ignore())
.ReverseMap();
CreateMap<VariableTable, VariableTableItem>()
.ReverseMap();
@@ -39,11 +40,12 @@ namespace DMS.WPF.Profiles
.ReverseMap();
CreateMap<NlogDto, NlogItem>().ReverseMap();
CreateMap<TriggerItem, TriggerItem>().ReverseMap();
// 添加触发器相关映射
CreateMap<TriggerItem, Core.Models.Triggers.Trigger>()
.ForMember(dest => dest.Variables, opt => opt.Ignore()) // 忽略Variables属性因为这个通常在业务逻辑中处理
.ReverseMap();
CreateMap<TriggerItem, Trigger>()
.ForMember(dest => dest.Variables, opt => opt.Ignore());
CreateMap<Trigger, TriggerItem>()
.ForMember(dest => dest.Variables, opt => opt.Ignore());
}
}
}

View File

@@ -61,9 +61,19 @@ public class TriggerDataService : ITriggerDataService
public void LoadAllTriggers()
{
_dataStorageService.Triggers.Clear();
foreach (var triggerDto in _appStorageService.Triggers.Values)
foreach (var trigger in _appStorageService.Triggers.Values)
{
_dataStorageService.Triggers.Add(triggerDto.Id, _mapper.Map<TriggerItem>(triggerDto));
TriggerItem triggerItem = _mapper.Map<TriggerItem>(trigger);
foreach (var variable in trigger.Variables)
{
if (_dataStorageService.Variables.TryGetValue(variable.Id,out var variableItem))
{
variableItem.Triggers.Add(triggerItem);
triggerItem.Variables.Add(variableItem);
}
}
_dataStorageService.Triggers.Add(trigger.Id, triggerItem);
}
}

View File

@@ -33,11 +33,6 @@ namespace DMS.WPF.ViewModels
[ObservableProperty]
private TriggerItem _currentTrigger;
/// <summary>
/// 与当前触发器关联的变量数据集合。
/// </summary>
[ObservableProperty]
private ObservableCollection<VariableItem> _associatedVariables;
[ObservableProperty]
private IList _selectedVariables = new ArrayList();
@@ -166,15 +161,6 @@ namespace DMS.WPF.ViewModels
{
CurrentTrigger = triggerItem;
// 初始化关联变量列表 - 从VariableIds创建VariableItems列表
AssociatedVariables = new ObservableCollection<VariableItem>();
foreach (var variableId in CurrentTrigger.VariableIds)
{
if (_dataStorageService.Variables.TryGetValue(variableId, out var variableItem))
{
AssociatedVariables.Add(variableItem);
}
}
}
return Task.CompletedTask;

View File

@@ -532,8 +532,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
}
// 批量更新数据库中的变量数据
var variableDtos = _mapper.Map<List<Variable>>(validVariables);
var result = await _variableManagementService.UpdateVariablesAsync(variableDtos);
var result = await _variableManagementService.UpdateVariablesAsync(_mapper.Map<List<Variable>>(validVariables));
if (result > 0)
{

View File

@@ -9,7 +9,8 @@
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
xmlns:converters="clr-namespace:DMS.WPF.Converters"
xmlns:valueConverts="clr-namespace:DMS.WPF.ValueConverts"
xmlns:triggers="clr-namespace:DMS.Core.Models.Triggers;assembly=DMS.Core"
xmlns:vm="clr-namespace:DMS.WPF.ViewModels"
d:DataContext="{d:DesignInstance vm:TriggerDetailViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
@@ -377,7 +378,7 @@
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
ItemsSource="{Binding AssociatedVariables}"
ItemsSource="{Binding CurrentTrigger.Variables}"
SelectionMode="Extended">
<i:Interaction.Behaviors>