From 6f0e80e1e2599d468c736c5b3ca81d31c359ccd0 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Sat, 6 Sep 2025 19:41:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90MQTT=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E5=88=AB=E5=90=8D=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DMS.Application/DTOs/VariableMqttAliasDto.cs | 12 ++++ DMS.Application/Profiles/MappingProfile.cs | 2 +- .../Services/MqttAliasAppService.cs | 8 ++- DMS.Infrastructure/Profiles/MappingProfile.cs | 2 - .../VariableMqttAliasRepository.cs | 55 ++++++++++++++++++- .../MqttAliasBatchEditDialogViewModel.cs | 5 +- .../Items/VariableMqttAliasItemViewModel.cs | 3 + DMS.WPF/ViewModels/VariableTableViewModel.cs | 3 +- .../Dialogs/MqttAliasBatchEditDialog.xaml | 3 +- 9 files changed, 83 insertions(+), 10 deletions(-) diff --git a/DMS.Application/DTOs/VariableMqttAliasDto.cs b/DMS.Application/DTOs/VariableMqttAliasDto.cs index a5829d0..0627f2b 100644 --- a/DMS.Application/DTOs/VariableMqttAliasDto.cs +++ b/DMS.Application/DTOs/VariableMqttAliasDto.cs @@ -1,3 +1,5 @@ +using DMS.Core.Models; + namespace DMS.Application.DTOs; /// @@ -10,4 +12,14 @@ public class VariableMqttAliasDto public int MqttServerId { get; set; } public string MqttServerName { get; set; } // 用于UI显示关联的服务器名称 public string Alias { get; set; } + + /// + /// 关联的变量对象。 + /// + public Variable Variable { get; set; } + + /// + /// 关联的MQTT服务器对象。 + /// + public MqttServer MqttServer { get; set; } } \ No newline at end of file diff --git a/DMS.Application/Profiles/MappingProfile.cs b/DMS.Application/Profiles/MappingProfile.cs index f1b133e..f14f236 100644 --- a/DMS.Application/Profiles/MappingProfile.cs +++ b/DMS.Application/Profiles/MappingProfile.cs @@ -36,7 +36,7 @@ public class MappingProfile : Profile // VariableMqttAlias 映射 CreateMap() - .ForMember(dest => dest.MqttServerName, opt => opt.Ignore()) + .ForMember(dest => dest.MqttServerName, opt => opt.MapFrom(src => src.MqttServer.ServerName)) .ReverseMap(); // VariableHistory 映射 diff --git a/DMS.Application/Services/MqttAliasAppService.cs b/DMS.Application/Services/MqttAliasAppService.cs index 583d529..78c77a2 100644 --- a/DMS.Application/Services/MqttAliasAppService.cs +++ b/DMS.Application/Services/MqttAliasAppService.cs @@ -57,11 +57,17 @@ public class MqttAliasAppService : IMqttAliasAppService else { // 如果不存在,则创建新的关联 + // 获取关联的Variable和MqttServer实体 + var variable = await _repoManager.Variables.GetByIdAsync(variableId); + var mqttServer = await _repoManager.MqttServers.GetByIdAsync(mqttServerId); + var newAlias = new VariableMqttAlias { VariableId = variableId, MqttServerId = mqttServerId, - Alias = alias + Alias = alias, + Variable = variable, + MqttServer = mqttServer }; await _repoManager.VariableMqttAliases.AddAsync(newAlias); } diff --git a/DMS.Infrastructure/Profiles/MappingProfile.cs b/DMS.Infrastructure/Profiles/MappingProfile.cs index f135cbe..c983c12 100644 --- a/DMS.Infrastructure/Profiles/MappingProfile.cs +++ b/DMS.Infrastructure/Profiles/MappingProfile.cs @@ -30,8 +30,6 @@ public class MappingProfile : Profile .ForMember(dest => dest.VariableAliases, opt => opt.Ignore()) .ReverseMap(); CreateMap() - .ForMember(dest => dest.Variable, opt => opt.Ignore()) - .ForMember(dest => dest.MqttServer, opt => opt.Ignore()) .ReverseMap(); CreateMap().ReverseMap(); diff --git a/DMS.Infrastructure/Repositories/VariableMqttAliasRepository.cs b/DMS.Infrastructure/Repositories/VariableMqttAliasRepository.cs index 8248869..2b2afd5 100644 --- a/DMS.Infrastructure/Repositories/VariableMqttAliasRepository.cs +++ b/DMS.Infrastructure/Repositories/VariableMqttAliasRepository.cs @@ -116,10 +116,43 @@ public class VariableMqttAliasRepository : BaseRepository, /// public async Task> GetAliasesForVariableAsync(int variableId) { + // 查询别名关联,并包含关联的Variable和MqttServer信息 var dbList = await Db.Queryable() .Where(x => x.VariableId == variableId) .ToListAsync(); - return _mapper.Map>(dbList); + + // 手动加载关联的Variable和MqttServer实体 + var variableIds = dbList.Select(x => x.VariableId).Distinct().ToList(); + var mqttServerIds = dbList.Select(x => x.MqttServerId).Distinct().ToList(); + + var variables = await Db.Queryable() + .In(x => x.Id, variableIds) + .ToListAsync(); + + var mqttServers = await Db.Queryable() + .In(x => x.Id, mqttServerIds) + .ToListAsync(); + + // 将关联实体映射到领域模型 + var variableDict = variables.ToDictionary(v => v.Id, v => _mapper.Map(v)); + var mqttServerDict = mqttServers.ToDictionary(m => m.Id, m => _mapper.Map(m)); + + // 映射主实体并设置导航属性 + var result = _mapper.Map>(dbList); + foreach (var alias in result) + { + if (variableDict.TryGetValue(alias.VariableId, out var variable)) + { + alias.Variable = variable; + } + + if (mqttServerDict.TryGetValue(alias.MqttServerId, out var mqttServer)) + { + alias.MqttServer = mqttServer; + } + } + + return result; } /// @@ -130,6 +163,24 @@ public class VariableMqttAliasRepository : BaseRepository, var dbAlias = await Db.Queryable() .Where(x => x.VariableId == variableId && x.MqttServerId == mqttServerId) .FirstAsync(); - return _mapper.Map(dbAlias); + + if (dbAlias == null) + return null; + + // 手动加载关联的Variable和MqttServer实体 + var variable = await Db.Queryable() + .Where(x => x.Id == variableId) + .FirstAsync(); + + var mqttServer = await Db.Queryable() + .Where(x => x.Id == mqttServerId) + .FirstAsync(); + + // 映射主实体并设置导航属性 + var result = _mapper.Map(dbAlias); + result.Variable = _mapper.Map(variable); + result.MqttServer = _mapper.Map(mqttServer); + + return result; } } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs index 35f9ea1..125209c 100644 --- a/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs @@ -47,6 +47,7 @@ namespace DMS.WPF.ViewModels.Dialogs MqttServerId = SelectedMqttServer.Id, MqttServerName = SelectedMqttServer.ServerName, MqttServer = SelectedMqttServer, + Variable = variable, Alias = existingAlias?.Alias ?? GenerateDefaultAlias(variable) }; @@ -60,7 +61,7 @@ namespace DMS.WPF.ViewModels.Dialogs private string GenerateDefaultAlias(VariableItemViewModel variable) { // 可以根据需要自定义默认别名生成逻辑 - return $"{variable.Name}_{Guid.NewGuid().ToString("N")[..8]}"; + return $"{variable.Name}"; } /// @@ -93,7 +94,7 @@ namespace DMS.WPF.ViewModels.Dialogs foreach (var alias in VariableMqttAliases) { - alias.Alias = $"{prefix}_{alias.VariableId}"; + alias.Alias = $"{prefix}_{alias.Variable.Name}"; } } } diff --git a/DMS.WPF/ViewModels/Items/VariableMqttAliasItemViewModel.cs b/DMS.WPF/ViewModels/Items/VariableMqttAliasItemViewModel.cs index 5d612ad..7216a6e 100644 --- a/DMS.WPF/ViewModels/Items/VariableMqttAliasItemViewModel.cs +++ b/DMS.WPF/ViewModels/Items/VariableMqttAliasItemViewModel.cs @@ -21,4 +21,7 @@ public partial class VariableMqttAliasItemViewModel : ObservableObject [ObservableProperty] private MqttServerItemViewModel _mqttServer; + + [ObservableProperty] + private VariableItemViewModel _variable; } diff --git a/DMS.WPF/ViewModels/VariableTableViewModel.cs b/DMS.WPF/ViewModels/VariableTableViewModel.cs index 5775c28..d11979f 100644 --- a/DMS.WPF/ViewModels/VariableTableViewModel.cs +++ b/DMS.WPF/ViewModels/VariableTableViewModel.cs @@ -626,7 +626,8 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable VariableId = originalVariable.Id, MqttServerId = selectedMqtt.Id, Alias = editedVariableMqtt.Alias, - MqttServer = selectedMqtt + MqttServer = selectedMqtt, + Variable = originalVariable }; // originalVariable.MqttAliases.Add(variableMqtt); } diff --git a/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml b/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml index e38d583..1ab2a4b 100644 --- a/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml +++ b/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml @@ -33,6 +33,7 @@ @@ -47,7 +48,7 @@ MaxHeight="500">