feat: 菜单管理重构及MQTT服务器功能增强

This commit is contained in:
2025-10-05 17:07:17 +08:00
parent 80ea47e627
commit 6b55211dbf
23 changed files with 287 additions and 184 deletions

View File

@@ -112,7 +112,6 @@ public class DeviceDataService : IDeviceDataService
if (addDto.DeviceMenu != null)
{
_menuDataService.AddMenuItem(_mapper.Map<MenuItemViewModel>(addDto.DeviceMenu));
_appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.DeviceMenu);
}
@@ -126,15 +125,11 @@ public class DeviceDataService : IDeviceDataService
if (addDto.VariableTable != null && addDto.VariableTableMenu != null)
{
_menuDataService.AddMenuItem(_mapper.Map<MenuItemViewModel>(addDto.VariableTableMenu));
_appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.VariableTableMenu);
}
}
// 添加null检查
_menuDataService.BuildMenuTrees();
return addDto;

View File

@@ -1,8 +1,12 @@
using System.Collections.ObjectModel;
using AutoMapper;
using DMS.Application.DTOs;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management;
using DMS.Application.Services.Management;
using DMS.WPF.Interfaces;
using DMS.WPF.ViewModels.Items;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
namespace DMS.WPF.Services;
@@ -14,6 +18,7 @@ public class MenuDataService : IMenuDataService
private readonly IMapper _mapper;
private readonly IDataStorageService _dataStorageService;
private readonly IAppDataStorageService _appDataStorageService;
private readonly IMenuManagementService _menuManagementService;
@@ -22,11 +27,12 @@ public class MenuDataService : IMenuDataService
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="appDataStorageService">数据服务中心实例。</param>
public MenuDataService(IMapper mapper,IDataStorageService dataStorageService, IAppDataStorageService appDataStorageService)
public MenuDataService(IMapper mapper,IDataStorageService dataStorageService, IAppDataStorageService appDataStorageService,IMenuManagementService menuManagementService)
{
_mapper = mapper;
_dataStorageService = dataStorageService;
_appDataStorageService = appDataStorageService;
_menuManagementService = menuManagementService;
}
public void LoadAllMenus()
@@ -65,18 +71,23 @@ public class MenuDataService : IMenuDataService
/// <summary>
/// 添加菜单项。
/// </summary>
public void AddMenuItem(MenuItemViewModel menuItemViewModel)
public async Task AddMenuItem(MenuItemViewModel menuItemViewModel)
{
if (menuItemViewModel == null)
{
return;
}
if (menuItemViewModel is null) return;
var deviceMenu = _dataStorageService.Menus.FirstOrDefault(m => m.Id == menuItemViewModel.ParentId);
if (deviceMenu != null)
if (deviceMenu is not null)
{
deviceMenu.Children.Add(menuItemViewModel);
_dataStorageService.Menus.Add(menuItemViewModel);
var menuId= await _menuManagementService.CreateMenuAsync(_mapper.Map<MenuBeanDto>(menuItemViewModel));
if (menuId>0)
{
menuItemViewModel.Id = menuId;
deviceMenu.Children.Add(menuItemViewModel);
_dataStorageService.Menus.Add(menuItemViewModel);
BuildMenuTrees();
}
}
}
@@ -84,17 +95,16 @@ public class MenuDataService : IMenuDataService
/// <summary>
/// 删除菜单项。
/// </summary>
public void DeleteMenuItem(MenuItemViewModel? menuItemViewModel)
public async Task DeleteMenuItem(MenuItemViewModel? menuItemViewModel)
{
if (menuItemViewModel == null)
{
return;
}
if (menuItemViewModel is null) return;
await _menuManagementService.DeleteMenuAsync(menuItemViewModel.Id);
// 从扁平菜单列表中移除
_dataStorageService.Menus.Remove(menuItemViewModel);
// 从树形结构中移除
//// 从树形结构中移除
if (menuItemViewModel.ParentId.HasValue && menuItemViewModel.ParentId.Value != 0)
{
// 如果有父菜单从父菜单的Children中移除
@@ -106,5 +116,7 @@ public class MenuDataService : IMenuDataService
// 如果是根菜单从MenuTrees中移除
_dataStorageService.MenuTrees.Remove(menuItemViewModel);
}
//BuildMenuTrees();
}
}

View File

@@ -1,11 +1,10 @@
using System.Collections.ObjectModel;
using AutoMapper;
using CommunityToolkit.Mvvm.ComponentModel;
using DMS.Application.DTOs;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Database;
using DMS.Application.Interfaces.Management;
using DMS.Core.Enums;
using DMS.WPF.Interfaces;
using DMS.WPF.ViewModels;
using DMS.WPF.ViewModels.Items;
namespace DMS.WPF.Services;
@@ -18,6 +17,8 @@ public class MqttDataService : IMqttDataService
private readonly IMapper _mapper;
private readonly IAppDataStorageService _appDataStorageService;
private readonly IMqttManagementService _mqttManagementService;
private readonly IMenuDataService _menuDataService;
private readonly IMenuManagementService _menuManagementServiceImpl;
private readonly IDataStorageService _dataStorageService;
@@ -26,11 +27,13 @@ public class MqttDataService : IMqttDataService
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="mqttAppService">MQTT应用服务实例。</param>
public MqttDataService(IMapper mapper, IAppDataStorageService appDataStorageService,IMqttManagementService mqttManagementService, IDataStorageService dataStorageService)
public MqttDataService(IMapper mapper, IAppDataStorageService appDataStorageService, IMqttManagementService mqttManagementService, IMenuDataService menuDataService, IMenuManagementService menuManagementServiceImpl, IDataStorageService dataStorageService)
{
_mapper = mapper;
_appDataStorageService = appDataStorageService;
_mqttManagementService = mqttManagementService;
_menuDataService = menuDataService;
_menuManagementServiceImpl = menuManagementServiceImpl;
_dataStorageService = dataStorageService;
}
@@ -44,7 +47,7 @@ public class MqttDataService : IMqttDataService
// 加载MQTT服务器数据
foreach (var mqttServerDto in _appDataStorageService.MqttServers.Values)
{
_dataStorageService.MqttServers.TryAdd(mqttServerDto.Id,_mapper.Map<MqttServerItemViewModel>(mqttServerDto));
_dataStorageService.MqttServers.TryAdd(mqttServerDto.Id, _mapper.Map<MqttServerItemViewModel>(mqttServerDto));
}
}
@@ -61,10 +64,30 @@ public class MqttDataService : IMqttDataService
/// </summary>
public async Task<MqttServerItemViewModel> AddMqttServer(MqttServerItemViewModel mqttServer)
{
var mqttServerDto = await _mqttManagementService.CreateMqttServerAsync(_mapper.Map<MqttServerDto>(mqttServer));
var mqttServerItem = _mapper.Map<MqttServerItemViewModel>(mqttServerDto);
_dataStorageService.MqttServers.Add(mqttServerItem.Id,mqttServerItem);
var addMqttServerDto = await _mqttManagementService.CreateMqttServerAsync(_mapper.Map<MqttServerDto>(mqttServer));
MqttServerItemViewModel mqttServerItem = _mapper.Map<MqttServerItemViewModel>(addMqttServerDto);
_dataStorageService.MqttServers.Add(mqttServerItem.Id, mqttServerItem);
var mqttRootMenu = _dataStorageService.Menus.FirstOrDefault(m => m.Header == "Mqtt服务器");
if (mqttRootMenu is not null)
{
var mqttServerMenu = new MenuBeanDto()
{
Header = mqttServerItem.ServerName,
TargetId = mqttServerItem.Id,
ParentId = mqttRootMenu.Id,
Icon = "\uE753", // 使用设备图标
MenuType = MenuType.MqttServerMenu,
TargetViewKey = nameof(MqttServerDetailViewModel),
};
await _menuDataService.AddMenuItem(_mapper.Map<MenuItemViewModel>(mqttServerMenu));
}
return mqttServerItem;
}
@@ -74,8 +97,24 @@ public class MqttDataService : IMqttDataService
public async Task<bool> UpdateMqttServer(MqttServerItemViewModel mqttServer)
{
var dto = _mapper.Map<MqttServerDto>(mqttServer);
await _mqttManagementService.UpdateMqttServerAsync(dto);
return true;
var result = await _mqttManagementService.UpdateMqttServerAsync(dto);
if (result > 0)
{
// 更新菜单项
var menu = _dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.MqttServerMenu && m.TargetId == mqttServer.Id);
if (menu != null)
{
// 更新菜单标题
menu.Header = mqttServer.ServerName;
// 使用菜单管理服务更新菜单
var menuDto = _mapper.Map<MenuBeanDto>(menu);
await _menuManagementServiceImpl.UpdateMenuAsync(menuDto);
}
}
return result > 0;
}
/// <summary>
@@ -83,8 +122,23 @@ public class MqttDataService : IMqttDataService
/// </summary>
public async Task<bool> DeleteMqttServer(MqttServerItemViewModel mqttServer)
{
await _mqttManagementService.DeleteMqttServerAsync(mqttServer.Id);
_dataStorageService.MqttServers.Remove(mqttServer.Id);
return true;
// 从数据库和内存中删除MQTT服务器
var result = await _mqttManagementService.DeleteMqttServerAsync(mqttServer.Id);
if (result)
{
// 从界面删除MQTT服务器菜单
var mqttServerMenu = _dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.MqttServerMenu && m.TargetId == mqttServer.Id);
if (mqttServerMenu != null)
{
await _menuDataService.DeleteMenuItem(mqttServerMenu);
}
// 从界面删除MQTT服务器
_dataStorageService.MqttServers.Remove(mqttServer.Id);
}
return result;
}
}