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);
}