Files
DMS/DMS.WPF/Services/MqttAliasDataService.cs
David P.G e78a7981e1 1 feat: 为MqttServerDetailView添加取消关联功能
2
   3 - 在MqttServerDetailView的DataGrid右键菜单中添加"取消关联"选项
   4 - 实现UnassignAlias命令,允许用户从MQTT服务器取消关联变量
   5 - 使用确认对话框以防止误操作
   6 - 集成现有的删除API来实际移除变量与MQTT服务器的关联
   7 - 更新UI以提供用户反馈
   8
   9 此功能允许用户通过右键菜单轻松取消MQTT服务器与变量的关联。
2025-10-11 19:56:59 +08:00

176 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using DMS.Application.DTOs;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management;
using DMS.WPF.Interfaces;
using DMS.WPF.ItemViewModel;
namespace DMS.WPF.Services;
/// <summary>
/// MQTT别名数据服务类负责管理MQTT别名相关的数据和操作。
/// </summary>
public class MqttAliasDataService : IMqttAliasDataService
{
private readonly IMapper _mapper;
private readonly IAppDataStorageService _appDataStorageService;
private readonly IMqttAliasManagementService _mqttAliasManagementService;
private readonly IDataStorageService _dataStorageService;
/// <summary>
/// MqttAliasDataService类的构造函数。
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="appDataStorageService">应用数据存储服务实例。</param>
/// <param name="mqttAliasManagementService">MQTT别名管理服务实例。</param>
/// <param name="dataStorageService">数据存储服务实例。</param>
public MqttAliasDataService(IMapper mapper,
IAppDataStorageService appDataStorageService,
IMqttAliasManagementService mqttAliasManagementService,
IDataStorageService dataStorageService)
{
_mapper = mapper;
_appDataStorageService = appDataStorageService;
_mqttAliasManagementService = mqttAliasManagementService;
_dataStorageService = dataStorageService;
}
/// <summary>
/// 加载所有MQTT别名数据。
/// </summary>
public async Task LoadMqttAliases()
{
try
{
// 清空现有数据
_dataStorageService.MqttAliases.Clear();
// 加载MQTT别名数据
foreach (var mqttAlias in _appDataStorageService.MqttAliases.Values)
{
MqttAliasItem mqttAliasItem = _mapper.Map<MqttAliasItem>(mqttAlias);
if(_dataStorageService.MqttAliases.TryAdd(mqttAlias.Id, mqttAliasItem))
{
if (_dataStorageService.MqttServers.TryGetValue(mqttAlias.MqttServerId,out var mqttServerItem))
{
mqttServerItem.VariableAliases.Add(mqttAliasItem);
mqttAliasItem.MqttServer = mqttServerItem;
}
if (_dataStorageService.Variables.TryGetValue(mqttAlias.VariableId,out var variableItem))
{
variableItem.MqttAliases.Add(mqttAliasItem);
mqttAliasItem.Variable = variableItem;
}
}
}
}
catch (Exception ex)
{
// 记录异常或处理错误
Console.WriteLine($"加载MQTT别名数据时发生错误: {ex.Message}");
}
}
/// <summary>
/// 添加MQTT别名。
/// </summary>
public async Task<MqttAliasItem> AssignAliasAsync(MqttAliasItem mqttAlias)
{
var addMqttAlias = await _mqttAliasManagementService.AssignAliasAsync(_mapper.Map<MqttAlias>(mqttAlias));
if (_dataStorageService.MqttAliases.ContainsKey(addMqttAlias.Id))
{
return null;
}
mqttAlias.Id = addMqttAlias.Id;
_dataStorageService.MqttAliases.Add(mqttAlias.Id, mqttAlias);
if (_dataStorageService.MqttServers.TryGetValue(mqttAlias.MqttServerId, out var mqttServerItem))
{
mqttAlias.MqttServer = mqttServerItem;
mqttServerItem.VariableAliases.Add(mqttAlias);
}
if (_dataStorageService.Variables.TryGetValue(mqttAlias.VariableId, out var variableItem))
{
mqttAlias.Variable = variableItem;
variableItem.MqttAliases.Add(mqttAlias);
}
return mqttAlias;
}
/// <summary>
/// 更新MQTT别名。
/// </summary>
public async Task<bool> UpdateMqttAlias(MqttAliasItem mqttAlias)
{
var result = await _mqttAliasManagementService.UpdateAsync(_mapper.Map<MqttAlias>(mqttAlias));
if (result > 0)
{
// 更新界面数据
if (_dataStorageService.MqttAliases.TryGetValue(mqttAlias.Id, out var existingAlias))
{
// 更新现有别名的属性
existingAlias.VariableId = mqttAlias.VariableId;
existingAlias.MqttServerId = mqttAlias.MqttServerId;
existingAlias.Alias = mqttAlias.Alias;
existingAlias.MqttServerName = mqttAlias.MqttServerName;
}
}
return result > 0;
}
/// <summary>
/// 删除MQTT别名。
/// </summary>
public async Task<bool> DeleteMqttAlias(MqttAliasItem mqttAlias)
{
// 从数据库和内存中删除MQTT别名
var result = await _mqttAliasManagementService.DeleteAsync(mqttAlias.Id);
if (result )
{
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;
}
/// <summary>
/// 根据ID获取MQTT别名。
/// </summary>
public async Task<MqttAliasItem> GetMqttAliasById(int id)
{
if (_dataStorageService.MqttAliases.TryGetValue(id, out var mqttAliasItem))
{
return mqttAliasItem;
}
// 如果内存中没有,则从数据库查询
var mqttAlias = await _mqttAliasManagementService.AssignAliasAsync(new MqttAlias { Id = id });
if (mqttAlias != null)
{
var mappedItem = _mapper.Map<MqttAliasItem>(mqttAlias);
_dataStorageService.MqttAliases.TryAdd(mappedItem.Id, mappedItem);
return mappedItem;
}
return null;
}
}