diff --git a/DMS.Application/Services/DataCenterService.cs b/DMS.Application/Services/DataCenterService.cs index a3f70be..3c256ad 100644 --- a/DMS.Application/Services/DataCenterService.cs +++ b/DMS.Application/Services/DataCenterService.cs @@ -185,8 +185,21 @@ public class DataCenterService : IDataCenterService /// public void RemoveDeviceFromMemory(int deviceId) { - if (Devices.TryRemove(deviceId, out var deviceDto)) + + if (Devices.TryGetValue(deviceId, out var deviceDto)) { + foreach (var variableTable in deviceDto.VariableTables) + { + foreach (var variable in variableTable.Variables) + { + Variables.TryRemove(variable.Id, out _); + } + + VariableTables.TryRemove(variableTable.Id, out _); + } + + Devices.TryRemove(deviceId, out _); + OnDeviceChanged(new DeviceChangedEventArgs(DataChangeType.Deleted, deviceDto)); } } @@ -244,7 +257,8 @@ public class DataCenterService : IDataCenterService if (Devices.TryGetValue(variableTableDto.DeviceId, out var device)) { deviceDto = device; - variableTableDto.Device = deviceDto; + device.VariableTables.Add(variableTableDto); + variableTableDto.Device = device; } if (VariableTables.TryAdd(variableTableDto.Id, variableTableDto)) @@ -660,26 +674,7 @@ public class DataCenterService : IDataCenterService Menus.TryAdd(menuDto.Id, menuDto); } - // 遍历所有菜单项,构建树形结构 - foreach (var menu in Menus.Values) - { - // 检查是否有父ID,并且父ID不为0(通常0或null表示根节点) - if (Menus.ContainsKey(menu.ParentId) && menu.ParentId != 0) - { - // 尝试从查找表中找到父菜单 - if (Menus.TryGetValue(menu.ParentId, out var parentMenu)) - { - // 将当前菜单添加到父菜单的Children列表中 - parentMenu.Children.Add(menu); - } - // else: 如果找不到父菜单,这可能是一个数据完整性问题,可以根据需要处理 - } - else - { - // 如果没有父ID,则这是一个根菜单 - MenuTrees.TryAdd(menu.Id, menu); - } - } + BuildMenuTrees(); // 触发数据加载完成事件 OnDataLoadCompleted(new DataLoadCompletedEventArgs( @@ -701,6 +696,30 @@ public class DataCenterService : IDataCenterService } } + private void BuildMenuTrees() + { + // 遍历所有菜单项,构建树形结构 + foreach (var menu in Menus.Values) + { + // 检查是否有父ID,并且父ID不为0(通常0或null表示根节点) + if (Menus.ContainsKey(menu.ParentId) && menu.ParentId != 0) + { + // 尝试从查找表中找到父菜单 + if (Menus.TryGetValue(menu.ParentId, out var parentMenu)) + { + // 将当前菜单添加到父菜单的Children列表中 + parentMenu.Children.Add(menu); + } + // else: 如果找不到父菜单,这可能是一个数据完整性问题,可以根据需要处理 + } + else + { + // 如果没有父ID,则这是一个根菜单 + MenuTrees.TryAdd(menu.Id, menu); + } + } + } + /// /// 异步加载所有菜单数据。 /// diff --git a/DMS.WPF/Services/DataServices.cs b/DMS.WPF/Services/DataServices.cs index 852f574..25fd8d6 100644 --- a/DMS.WPF/Services/DataServices.cs +++ b/DMS.WPF/Services/DataServices.cs @@ -1,6 +1,7 @@ using System.Collections.ObjectModel; using AutoMapper; using CommunityToolkit.Mvvm.ComponentModel; +using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Enums; using DMS.Core.Models; @@ -43,7 +44,6 @@ public partial class DataServices : ObservableObject // private List _mqtts; - // 设备列表变更事件,当设备列表数据更新时触发。 public event Action> OnDeviceListChanged; @@ -83,14 +83,137 @@ public partial class DataServices : ObservableObject public async Task LoadAllDatas() { Devices = _mapper.Map>(_dataCenterService.Devices.Values); - VariableTables= _mapper.Map>(_dataCenterService.VariableTables.Values); - Variables= _mapper.Map>(_dataCenterService.Variables.Values); - Menus= _mapper.Map>(_dataCenterService.Menus.Values); - MenuTrees= _mapper.Map>(_dataCenterService.MenuTrees.Values); - + foreach (var device in Devices) + { + foreach (var variableTable in device.VariableTables) + { + VariableTables.Add(variableTable); + foreach (var variable in variableTable.Variables) + { + Variables.Add(variable); + } + } + } + + Menus = _mapper.Map>(_dataCenterService.Menus.Values); + + BuildMenuTrees(); + } + + public async Task AddDevice(CreateDeviceWithDetailsDto dto) + { + var addDto = await _dataCenterService.CreateDeviceWithDetailsAsync(dto); + //更新当前界面 + Devices.Add(_mapper.Map(addDto.Device)); + AddMenuItem(_mapper.Map(addDto.DeviceMenu)); + AddVariableTable(_mapper.Map(addDto.VariableTable)); + AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); + //更新数据中心 + _dataCenterService.AddDeviceToMemory(addDto.Device); + _dataCenterService.AddVariableTableToMemory(addDto.VariableTable); + _dataCenterService.AddMenuToMemory(addDto.DeviceMenu); + _dataCenterService.AddMenuToMemory(addDto.VariableTableMenu); + + BuildMenuTrees(); + + + return addDto; + } + + + public async Task DeleteDevice(DeviceItemViewModel device) + { + if (!await _dataCenterService.DeleteDeviceByIdAsync(device.Id)) + { + return false; + } + + _dataCenterService.RemoveDeviceFromMemory(device.Id); + + + // 1. 删除与设备关联的所有变量表及其变量 + foreach (var variableTable in device.VariableTables) + { + // 删除与当前变量表关联的所有变量 + foreach (var variable in variableTable.Variables) + { + Variables.Remove(variable); + } + + var variableTableMenu + = Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); + DeleteMenuItem(variableTableMenu); + // 删除变量表 + VariableTables.Remove(variableTable); + } + + // 2. 删除设备 + Devices.Remove(device); + + // 3. 删除与设备关联的菜单项 + var deviceMenu = Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu && m.TargetId == device.Id); + DeleteMenuItem(deviceMenu); + + + return true; + } + + + public void DeleteVariableTableById(int id) + { + var variableTable = VariableTables.FirstOrDefault(vt => vt.Id == id); + if (variableTable != null) + { + // 删除与当前变量表关联的所有变量 + var variablesToDelete = Variables.Where(v => v.VariableTableId == variableTable.Id) + .ToList(); + foreach (var variable in variablesToDelete) + { + Variables.Remove(variable); + } + + + var device = Devices.FirstOrDefault(d => d.Id == variableTable.DeviceId); + if (device != null) + device.VariableTables.Remove(variableTable); + // 删除变量表 + VariableTables.Remove(variableTable); + + // 删除与变量表关联的菜单项 + var variableTableMenu + = Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); + if (variableTableMenu != null) + { + DeleteMenuItem(variableTableMenu); + } + } + } + + + private void BuildMenuTrees() + { + MenuTrees.Clear(); + // 遍历所有菜单项,构建树形结构 + foreach (var menu in Menus) + { + var parentMenu = Menus.FirstOrDefault(m => m.Id == menu.ParentId); + // 检查是否有父ID,并且父ID不为0(通常0或null表示根节点) + if (parentMenu != null && menu.ParentId != 0) + { + // 将当前菜单添加到父菜单的Children列表中 + if (!parentMenu.Children.Contains(menu)) + { + parentMenu.Children.Add(menu); + } + } + else + { + // 如果没有父ID,则这是一个根菜单 + MenuTrees.Add(menu); + } + } } - public void AddMenuItem(MenuItemViewModel menuItemViewModel) { if (menuItemViewModel == null) @@ -132,10 +255,9 @@ public partial class DataServices : ObservableObject variableTable.Variables.Add(variableItem); Variables.Add(variableItem); } - } - public void DeleteMenuItem(MenuItemViewModel menuItemViewModel) + public void DeleteMenuItem(MenuItemViewModel? menuItemViewModel) { if (menuItemViewModel == null) { @@ -159,80 +281,6 @@ public partial class DataServices : ObservableObject } } - public async Task DeleteDeviceById(int selectedDeviceId) - { - var device = Devices.FirstOrDefault(d => d.Id == selectedDeviceId); - if (device != null) - { - // 1. 删除与设备关联的所有变量表及其变量 - var variableTablesToDelete = VariableTables.Where(vt => vt.DeviceId == device.Id) - .ToList(); - foreach (var vt in variableTablesToDelete) - { - // 删除与当前变量表关联的所有变量 - var variablesToDelete = Variables.Where(v => v.VariableTableId == vt.Id) - .ToList(); - foreach (var variable in variablesToDelete) - { - Variables.Remove(variable); - } - - // 删除变量表 - VariableTables.Remove(vt); - - // 删除与变量表关联的菜单项 - var variableTableMenu - = Menus.FirstOrDefault(m => m.TargetViewKey == "VariableTableView" && m.Header == vt.Name); - if (variableTableMenu != null) - { - DeleteMenuItem(variableTableMenu); - } - } - - // 2. 删除设备 - Devices.Remove(device); - - // 3. 删除与设备关联的菜单项 - var deviceMenu = Menus.FirstOrDefault(m => m.TargetViewKey == "DevicesView" && m.Header == device.Name); - if (deviceMenu != null) - { - DeleteMenuItem(deviceMenu); - } - - // 4. 重新构建菜单树以反映变更 - // BuildMenuTree(); - } - } - - public void DeleteVariableTableById(int id) - { - var variableTable = VariableTables.FirstOrDefault(vt => vt.Id == id); - if (variableTable != null) - { - // 删除与当前变量表关联的所有变量 - var variablesToDelete = Variables.Where(v => v.VariableTableId == variableTable.Id) - .ToList(); - foreach (var variable in variablesToDelete) - { - Variables.Remove(variable); - } - - - var device = Devices.FirstOrDefault(d => d.Id == variableTable.DeviceId); - if (device != null) - device.VariableTables.Remove(variableTable); - // 删除变量表 - VariableTables.Remove(variableTable); - - // 删除与变量表关联的菜单项 - var variableTableMenu - = Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); - if (variableTableMenu != null) - { - DeleteMenuItem(variableTableMenu); - } - } - } public void DeleteVariableById(int id) { @@ -247,7 +295,5 @@ public partial class DataServices : ObservableObject variableTable.Variables.Remove(variableItem); Variables.Remove(variableItem); - - } } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/DevicesViewModel.cs b/DMS.WPF/ViewModels/DevicesViewModel.cs index 27f4e72..bf6b9c3 100644 --- a/DMS.WPF/ViewModels/DevicesViewModel.cs +++ b/DMS.WPF/ViewModels/DevicesViewModel.cs @@ -64,19 +64,6 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable } - public override Task OnExitAsync() - { - // if (_dataServices.Devices!=null && _dataServices.Devices.Count>0) - // { - // foreach (var device in Devices) - // { - // device.OnDeviceIsActiveChanged -= HandleDeviceIsActiveChanged; - // } - // } - - return Task.FromResult(true); - } - /// /// 添加设备命令。 /// @@ -87,10 +74,10 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable { // 1. 显示添加设备对话框 DeviceItemViewModel device = await _dialogService.ShowDialogAsync(new DeviceDialogViewModel() - { - Title = "添加设备", - PrimaryButText = "添加设备" - }); + { + Title = "添加设备", + PrimaryButText = "添加设备" + }); // 如果用户取消或对话框未返回设备,则直接返回 if (device == null) { @@ -107,7 +94,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable Header = device.Name, Icon = SegoeFluentIcons.Devices2.Glyph, TargetViewKey = "DeviceDetailView" - }; + }; if (device.IsAddDefVarTable) { dto.VariableTable = new VariableTableDto() @@ -124,13 +111,9 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable }; } - var addDto = await _deviceAppService.CreateDeviceWithDetailsAsync(dto); - // 更新界面 - DataServices.Devices.Add(_mapper.Map(addDto.Device)); - DataServices.AddMenuItem(_mapper.Map(addDto.DeviceMenu)); - DataServices.AddVariableTable(_mapper.Map(addDto.VariableTable)); - DataServices.AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); + // 添加设备 + var addDto = await DataServices.AddDevice(dto); NotificationHelper.ShowSuccess($"设备添加成功:{addDto.Device.Name}"); } @@ -145,7 +128,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 删除设备命令。 /// [RelayCommand] - public async void DeleteDevice() + private async Task DeleteDevice() { try { @@ -155,16 +138,13 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable return; } - - if (await _dialogService.ShowDialogAsync(new ConfirmDialogViewModel("删除设备",$"确认要删除设备名为:{SelectedDevice.Name}","删除设备"))) + var viewModel = new ConfirmDialogViewModel("删除设备", $"确认要删除设备名为:{SelectedDevice.Name}", "删除设备"); + if (await _dialogService.ShowDialogAsync(viewModel)) { - var isDel = await _deviceAppService.DeleteDeviceByIdAsync(SelectedDevice.Id); - if (isDel) + var deviceName = SelectedDevice.Name; + if (await DataServices.DeleteDevice(SelectedDevice)) { - // 更新界面 - DataServices.DeleteDeviceById(SelectedDevice.Id); - - NotificationHelper.ShowSuccess($"删除设备成功,设备名:{SelectedDevice.Name}"); + NotificationHelper.ShowSuccess($"删除设备成功,设备名:{deviceName}"); } } } @@ -178,7 +158,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 编辑设备命令。 /// [RelayCommand] - public async void EditDevice() + private async Task EditDevice() { try { @@ -190,7 +170,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable DeviceDialogViewModel deviceDialogViewModel = new DeviceDialogViewModel(SelectedDevice) { - PrimaryButText = "编辑设备" + PrimaryButText = "编辑设备" }; // 1. 显示设备对话框 DeviceItemViewModel device = await _dialogService.ShowDialogAsync(deviceDialogViewModel); @@ -223,9 +203,10 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable { if (SelectedDevice == null) return; - var menu=DataServices.Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu && m.TargetId == SelectedDevice.Id); - if (menu==null) return; - + var menu = DataServices.Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu && + m.TargetId == SelectedDevice.Id); + if (menu == null) return; + _navigationService.NavigateToAsync(menu); }