wip
This commit is contained in:
@@ -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;
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user