This commit is contained in:
2025-10-20 22:47:22 +08:00
parent 7ad1b7d5e1
commit b980f989d8
17 changed files with 131 additions and 82 deletions

View File

@@ -9,13 +9,14 @@ using DMS.Core.Enums;
using DMS.Core.Events;
using DMS.WPF.Interfaces;
using DMS.WPF.ItemViewModel;
using DMS.WPF.ViewModels;
namespace DMS.WPF.Services;
/// <summary>
/// 设备数据服务类,负责管理设备相关的数据和操作。
/// </summary>
public class DeviceWpfService : IDeviceDataService
public class DeviceViewService : IDeviceDataService
{
private readonly IMapper _mapper;
private readonly IAppCenterService _appCenterService;
@@ -24,7 +25,7 @@ public class DeviceWpfService : IDeviceDataService
private readonly IVariableTableDataService _variableTableDataService;
private readonly IEventService _eventService;
private readonly INotificationService _notificationService;
private readonly IMenuWpfService _menuDataService;
private readonly IMenuViewService _menuDataService;
private readonly IVariableDataService _variableDataService;
private readonly Dispatcher _uiDispatcher;
@@ -33,12 +34,12 @@ public class DeviceWpfService : IDeviceDataService
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="appCenterService">数据服务中心实例。</param>
public DeviceWpfService(IMapper mapper, IAppCenterService appCenterService,
IAppStorageService appStorageService, IWpfDataService dataStorageService, IVariableTableDataService variableTableDataService,
public DeviceViewService(IMapper mapper, IAppCenterService appCenterService,
IAppStorageService appStorageService, IWpfDataService dataStorageService,
IVariableTableDataService variableTableDataService,
IEventService eventService, INotificationService notificationService,
IMenuWpfService menuDataService, IVariableDataService variableDataService)
IMenuViewService menuDataService, IVariableDataService variableDataService)
{
_mapper = mapper;
_appCenterService = appCenterService;
_appStorageService = appStorageService;
@@ -60,10 +61,8 @@ public class DeviceWpfService : IDeviceDataService
{
_uiDispatcher.Invoke(() =>
{
if (_dataStorageService.Devices.TryGetValue(e.DeviceId, out DeviceItem device))
{
device.IsRunning = e.StateValue;
if (device.IsRunning)
{
@@ -92,10 +91,27 @@ public class DeviceWpfService : IDeviceDataService
/// <summary>
/// 添加设备。
/// </summary>
public async Task<CreateDeviceWithDetailsDto?> AddDevice(CreateDeviceWithDetailsDto dto)
public async Task<CreateDeviceWithDetailsDto?> AddDeviceAsync(CreateDeviceWithDetailsDto dto)
{
// 添加null检查
if (dto is null) return null;
if (dto.VariableTable is not null)
{
dto.VariableTable.Protocol = dto.Device.Protocol;
dto.VariableTableMenu.MenuType = MenuType.VariableTableMenu;
}
//查找到设备的根菜单
var parentMenu
= _appStorageService.Menus.Values.FirstOrDefault(m => m.TargetViewKey == nameof(DevicesViewModel) &&
m.TargetId == 0);
if (parentMenu is not null)
{
dto.DeviceMenu.MenuType = MenuType.DeviceMenu;
dto.DeviceMenu.ParentId = parentMenu.Id;
}
var addDto = await _appCenterService.DeviceManagementService.CreateDeviceWithDetailsAsync(dto);
@@ -109,10 +125,8 @@ public class DeviceWpfService : IDeviceDataService
if (addDto.DeviceMenu != null)
{
_menuDataService.AddMenuToView(_mapper.Map<MenuItem>(addDto.DeviceMenu));
}
// 添加变量表和变量表菜单
if (addDto.VariableTable != null)
{
@@ -123,41 +137,47 @@ public class DeviceWpfService : IDeviceDataService
{
_menuDataService.AddMenuToView(_mapper.Map<MenuItem>(addDto.VariableTableMenu));
}
}
return addDto;
}
/// <summary>
/// 删除设备。
/// </summary>
public async Task<bool> DeleteDevice(DeviceItem device)
public async Task<bool> DeleteDevice(DeviceItem deviceItem)
{
if (!_appStorageService.Devices.TryGetValue(deviceItem.Id,out var device))
{
return false;
}
//从数据库和内存中删除设备相关数据
if (!await _appCenterService.DeviceManagementService.DeleteDeviceByIdAsync(device.Id))
bool res = await _appCenterService.DeviceManagementService.DeleteAsync(device);
if (!res)
{
return false;
}
// 从界面删除设备相关数据集
var variableTablesCopy = device.VariableTables.ToList();
var variableTablesCopy = deviceItem.VariableTables.ToList();
foreach (var variableTable in variableTablesCopy)
{
await _variableTableDataService.DeleteVariableTable(variableTable);
}
var deviceMenu = _dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu && m.TargetId == device.Id);
var deviceMenu
= _dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu &&
m.TargetId == deviceItem.Id);
if (deviceMenu != null)
{
await _menuDataService.DeleteMenuItem(deviceMenu);
}
_dataStorageService.Devices.Remove(device.Id);
_dataStorageService.Devices.Remove(deviceItem.Id);
return true;

View File

@@ -13,7 +13,7 @@ namespace DMS.WPF.Services;
/// <summary>
/// 菜单数据服务类,负责管理菜单相关的数据和操作。
/// </summary>
public class MenuWpfService : IMenuWpfService
public class MenuViewService : IMenuViewService
{
private readonly IMapper _mapper;
private readonly IWpfDataService _wpfDataService;
@@ -27,7 +27,7 @@ public class MenuWpfService : IMenuWpfService
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="appStorageService">数据服务中心实例。</param>
public MenuWpfService(IMapper mapper, IWpfDataService dataStorageService, IAppStorageService appStorageService, IMenuManagementService menuManagementService)
public MenuViewService(IMapper mapper, IWpfDataService dataStorageService, IAppStorageService appStorageService, IMenuManagementService menuManagementService)
{
_mapper = mapper;
_wpfDataService = dataStorageService;
@@ -46,7 +46,16 @@ public class MenuWpfService : IMenuWpfService
/// </summary>
public void BuildMenuTrees()
{
_wpfDataService.MenuTrees.Clear();
// 创建一个新的临时列表来存储根菜单
var newRootMenus = new List<MenuItem>();
// 首先确保所有菜单项的Children集合是干净的
foreach (var menu in _wpfDataService.Menus)
{
// 避免循环引用清空Children集合
menu.Children.Clear();
}
// 遍历所有菜单项,构建树形结构
foreach (var menu in _wpfDataService.Menus)
{
@@ -63,9 +72,16 @@ public class MenuWpfService : IMenuWpfService
else
{
// 如果没有父ID则这是一个根菜单
_wpfDataService.MenuTrees.Add(menu);
newRootMenus.Add(menu);
}
}
// 在UI线程安全地更新MenuTrees集合
_wpfDataService.MenuTrees.Clear();
foreach (var rootMenu in newRootMenus)
{
_wpfDataService.MenuTrees.Add(rootMenu);
}
}
/// <summary>
@@ -75,14 +91,17 @@ public class MenuWpfService : IMenuWpfService
{
if (MenuItem is null) return;
var deviceMenu = _wpfDataService.Menus.FirstOrDefault(m => m.Id == MenuItem.ParentId);
if (deviceMenu is not null)
var parentMenu = _wpfDataService.Menus.FirstOrDefault(m => m.Id == MenuItem.ParentId);
if (parentMenu is not null)
{
deviceMenu.Children.Add(MenuItem);
// 首先添加到菜单列表
_wpfDataService.Menus.Add(MenuItem);
BuildMenuTrees();
// 然后将当前菜单添加到父菜单的Children列表中
if (!parentMenu.Children.Contains(MenuItem))
{
parentMenu.Children.Add(MenuItem);
}
}
}
@@ -119,7 +138,7 @@ public class MenuWpfService : IMenuWpfService
// 从扁平菜单列表中移除
_wpfDataService.Menus.Remove(MenuItem);
//// 从树形结构中移除
// 从树形结构中移除
if (MenuItem.ParentId.HasValue && MenuItem.ParentId.Value != 0)
{
// 如果有父菜单从父菜单的Children中移除
@@ -132,6 +151,7 @@ public class MenuWpfService : IMenuWpfService
_wpfDataService.MenuTrees.Remove(MenuItem);
}
//BuildMenuTrees();
// 重新构建整个菜单树以确保一致性
BuildMenuTrees();
}
}

View File

@@ -19,7 +19,7 @@ public class MqttDataService : IMqttDataService
private readonly IMapper _mapper;
private readonly IAppStorageService _appStorageService;
private readonly IMqttManagementService _mqttManagementService;
private readonly IMenuWpfService _menuDataService;
private readonly IMenuViewService _menuDataService;
private readonly IMenuManagementService _menuManagementServiceImpl;
private readonly IWpfDataService _dataStorageService;
@@ -29,7 +29,7 @@ public class MqttDataService : IMqttDataService
/// </summary>
/// <param name="mapper">AutoMapper 实例。</param>
/// <param name="mqttAppService">MQTT应用服务实例。</param>
public MqttDataService(IMapper mapper, IAppStorageService appStorageService, IMqttManagementService mqttManagementService, IMenuWpfService menuDataService, IMenuManagementService menuManagementServiceImpl, IWpfDataService dataStorageService)
public MqttDataService(IMapper mapper, IAppStorageService appStorageService, IMqttManagementService mqttManagementService, IMenuViewService menuDataService, IMenuManagementService menuManagementServiceImpl, IWpfDataService dataStorageService)
{
_mapper = mapper;
_appStorageService = appStorageService;
@@ -87,7 +87,7 @@ public class MqttDataService : IMqttDataService
MenuType = MenuType.MqttServerMenu,
TargetViewKey = nameof(MqttServerDetailViewModel),
};
await _menuDataService.AddMenuToView(_mapper.Map<MenuItem>(mqttServerMenu));
_menuDataService.AddMenuToView(_mapper.Map<MenuItem>(mqttServerMenu));
}
return mqttServerItem;

View File

@@ -24,7 +24,7 @@ public class TriggerDataService : ITriggerDataService
{
private readonly IMapper _mapper;
private readonly IAppCenterService _appCenterService;
private readonly IMenuWpfService _menuDataService;
private readonly IMenuViewService _menuDataService;
private readonly IAppStorageService _appStorageService;
private readonly IWpfDataService _dataStorageService;
private readonly IEventService _eventService;
@@ -41,7 +41,7 @@ public class TriggerDataService : ITriggerDataService
/// <param name="eventService">事件服务实例。</param>
/// <param name="notificationService">通知服务实例。</param>
public TriggerDataService(IMapper mapper, IAppCenterService appCenterService,
IMenuWpfService menuDataService,
IMenuViewService menuDataService,
IAppStorageService appStorageService, IWpfDataService dataStorageService,
IEventService eventService, INotificationService notificationService)
{
@@ -111,7 +111,7 @@ public class TriggerDataService : ITriggerDataService
Icon = "\uE945", // 使用触发器图标
TargetViewKey = nameof(TriggerDetailViewModel),
};
await _menuDataService.AddMenuToView(menuItem);
_menuDataService.AddMenuToView(menuItem);
}

View File

@@ -14,12 +14,12 @@ public class VariableTableDataService : IVariableTableDataService
private readonly IMapper _mapper;
private readonly IWpfDataService _dataStorageService;
private readonly IAppCenterService _appCenterService;
private readonly IMenuWpfService _menuDataService;
private readonly IMenuViewService _menuDataService;
public VariableTableDataService(IMapper mapper, IWpfDataService dataStorageService, IAppCenterService appCenterService,
IMenuWpfService menuDataService)
IMenuViewService menuDataService)
{
_mapper = mapper;
_dataStorageService = dataStorageService;
@@ -53,7 +53,7 @@ public class VariableTableDataService : IVariableTableDataService
createDto.Menu = menuDto;
var resDto = await _appCenterService.VariableTableManagementService.CreateVariableTableAsync(createDto);
await _menuDataService.AddMenuToView(_mapper.Map<MenuItem>(resDto.Menu));
_menuDataService.AddMenuToView(_mapper.Map<MenuItem>(resDto.Menu));
return resDto.VariableTable.Id;
}

View File

@@ -32,7 +32,7 @@ public class WPFDataService : IWPFDataService
/// <summary>
/// 菜单数据服务。
/// </summary>
public IMenuWpfService MenuDataService { get; }
public IMenuViewService MenuDataService { get; }
/// <summary>
/// MQTT数据服务。
@@ -62,7 +62,7 @@ public class WPFDataService : IWPFDataService
IAppCenterService appCenterService,
IDeviceDataService deviceDataService,
IVariableDataService variableDataService,
IMenuWpfService menuDataService,
IMenuViewService menuDataService,
IMqttDataService mqttDataService,
ILogDataService logDataService,
IVariableTableDataService variableTableDataService,