diff --git a/DMS.Application/Interfaces/IVariableTableAppService.cs b/DMS.Application/Interfaces/IVariableTableAppService.cs index 03f9da7..e3e0cb8 100644 --- a/DMS.Application/Interfaces/IVariableTableAppService.cs +++ b/DMS.Application/Interfaces/IVariableTableAppService.cs @@ -9,7 +9,7 @@ namespace DMS.Application.Interfaces { Task GetVariableTableByIdAsync(int id); Task> GetAllVariableTablesAsync(); - Task CreateVariableTableAsync(CreateVariableTableWithMenuDto createDto); + Task CreateVariableTableAsync(CreateVariableTableWithMenuDto createDto); Task UpdateVariableTableAsync(VariableTableDto variableTableDto); Task DeleteVariableTableAsync(int id); } diff --git a/DMS.Application/Services/VariableTableAppService.cs b/DMS.Application/Services/VariableTableAppService.cs index 630e7d9..2d1e138 100644 --- a/DMS.Application/Services/VariableTableAppService.cs +++ b/DMS.Application/Services/VariableTableAppService.cs @@ -56,7 +56,7 @@ namespace DMS.Application.Services /// 包含变量表和菜单信息的创建数据传输对象。 /// 创建后的变量表数据传输对象。 /// 如果添加变量表失败或找不到设备菜单。 - public async Task CreateVariableTableAsync(CreateVariableTableWithMenuDto createDto) + public async Task CreateVariableTableAsync(CreateVariableTableWithMenuDto createDto) { await _repositoryManager.BeginTranAsync(); try @@ -69,6 +69,8 @@ namespace DMS.Application.Services { throw new ApplicationException($"添加变量表失败,设备ID:{createDto.DeviceId},请检查。"); } + + _mapper.Map(createdVariableTable, createDto.VariableTable); if (createDto.Menu!=null) { @@ -84,16 +86,18 @@ namespace DMS.Application.Services // 映射菜单实体并设置关联信息 var menu = _mapper.Map(createDto.Menu); menu.ParentId = deviceMenu.Id; + menu.TargetViewKey = "VariableTableMenu"; menu.TargetId = createdVariableTable.Id; menu.MenuType = MenuType.VariableTableMenu; - await _repositoryManager.Menus.AddAsync(menu); + var addMenu= await _repositoryManager.Menus.AddAsync(menu); + _mapper.Map(addMenu, createDto.Menu); } await _repositoryManager.CommitAsync(); - return _mapper.Map(createdVariableTable); + return createDto; } catch { diff --git a/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs b/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs index d3b6fc0..7e31d9f 100644 --- a/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs +++ b/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs @@ -26,7 +26,7 @@ public class VariableTableAppServiceTest : BaseServiceTest DeviceId = 5 }; var addVarTable= await _variableTableAppService.CreateVariableTableAsync(dto); - Assert.NotEqual(addVarTable.Id, 0); + Assert.NotEqual(addVarTable.VariableTable.Id, 0); } [Fact] @@ -40,16 +40,16 @@ public class VariableTableAppServiceTest : BaseServiceTest DeviceId = 5 // Assuming a device with ID 5 exists for testing }; var createdVariableTable = await _variableTableAppService.CreateVariableTableAsync(createDto); - Assert.NotEqual(createdVariableTable.Id, 0); + Assert.NotEqual(createdVariableTable.VariableTable.Id, 0); // Act: Delete the created variable table - var isDeleted = await _variableTableAppService.DeleteVariableTableAsync(createdVariableTable.Id); + var isDeleted = await _variableTableAppService.DeleteVariableTableAsync(createdVariableTable.VariableTable.Id); // Assert: Verify deletion was successful Assert.True(isDeleted); // Optionally, try to retrieve the deleted variable table to confirm it's gone - var deletedTable = await _variableTableAppService.GetVariableTableByIdAsync(createdVariableTable.Id); + var deletedTable = await _variableTableAppService.GetVariableTableByIdAsync(createdVariableTable.VariableTable.Id); Assert.Null(deletedTable); } @@ -64,20 +64,20 @@ public class VariableTableAppServiceTest : BaseServiceTest DeviceId = 5 // Assuming a device with ID 5 exists for testing }; var createdVariableTable = await _variableTableAppService.CreateVariableTableAsync(createDto); - Assert.NotEqual(createdVariableTable.Id, 0); + Assert.NotEqual(createdVariableTable.VariableTable.Id, 0); // Modify some properties of the DTO - createdVariableTable.Name = "Updated Variable Table Name"; - createdVariableTable.Description = "This is an updated description."; + createdVariableTable.VariableTable.Name = "Updated Variable Table Name"; + createdVariableTable.VariableTable.Description = "This is an updated description."; // Act: Update the variable table - var affectedRows = await _variableTableAppService.UpdateVariableTableAsync(createdVariableTable); + var affectedRows = await _variableTableAppService.UpdateVariableTableAsync(createdVariableTable.VariableTable); // Assert: Verify update was successful Assert.Equal(1, affectedRows); // Retrieve the updated variable table to confirm changes - var updatedTable = await _variableTableAppService.GetVariableTableByIdAsync(createdVariableTable.Id); + var updatedTable = await _variableTableAppService.GetVariableTableByIdAsync(createdVariableTable.VariableTable.Id); Assert.NotNull(updatedTable); Assert.Equal("Updated Variable Table Name", updatedTable.Name); Assert.Equal("This is an updated description.", updatedTable.Description); diff --git a/DMS.WPF/DMS.WPF.csproj b/DMS.WPF/DMS.WPF.csproj index 799a214..a602e76 100644 --- a/DMS.WPF/DMS.WPF.csproj +++ b/DMS.WPF/DMS.WPF.csproj @@ -84,7 +84,7 @@ Wpf Designer - + MSBuild:Compile Wpf Designer diff --git a/DMS.WPF/Services/DataServices.cs b/DMS.WPF/Services/DataServices.cs index f608ed9..84ef9e3 100644 --- a/DMS.WPF/Services/DataServices.cs +++ b/DMS.WPF/Services/DataServices.cs @@ -484,12 +484,12 @@ public partial class DataServices : ObservableRecipient, IRecipient { if (variableTableItemViewModel == null) return; - - VariableTables.Add(variableTableItemViewModel); + var device = Devices.FirstOrDefault(d => d.Id == variableTableItemViewModel.DeviceId); if (device != null) { device.VariableTables.Add(variableTableItemViewModel); + VariableTables.Add(variableTableItemViewModel); } } diff --git a/DMS.WPF/Services/DialogService.cs b/DMS.WPF/Services/DialogService.cs index 7a9c773..949863b 100644 --- a/DMS.WPF/Services/DialogService.cs +++ b/DMS.WPF/Services/DialogService.cs @@ -15,6 +15,7 @@ namespace DMS.WPF.Services { { typeof(DeviceDialogViewModel), typeof(DeviceDialog) }, { typeof(ConfrimDialogViewModel), typeof(ConfirmDialog) }, + { typeof(VariableTableDialogViewModel), typeof(VariableTableDialog) }, // { typeof(MqttDialogViewModel), typeof(MqttDialog) }, // Add other mappings here // ... other dialogs }; diff --git a/DMS.WPF/ViewModels/DeviceDetailViewModel.cs b/DMS.WPF/ViewModels/DeviceDetailViewModel.cs index ea61f5f..05f23ba 100644 --- a/DMS.WPF/ViewModels/DeviceDetailViewModel.cs +++ b/DMS.WPF/ViewModels/DeviceDetailViewModel.cs @@ -1,16 +1,24 @@ +using AutoMapper; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using DMS.Application.DTOs; +using DMS.Application.Interfaces; using DMS.Core.Enums; +using DMS.Helper; using DMS.WPF.Services; using DMS.Services; +using DMS.WPF.ViewModels.Dialogs; using DMS.WPF.ViewModels.Items; +using iNKORE.UI.WPF.Modern.Common.IconKeys; namespace DMS.WPF.ViewModels; -public partial class DeviceDetailViewModel : ViewModelBase,INavigatable +public partial class DeviceDetailViewModel : ViewModelBase, INavigatable { + private readonly IMapper _mapper; private readonly IDialogService _dialogService; private readonly INavigationService _navigationService; + private readonly IVariableTableAppService _variableTableAppService; public DataServices DataServices { get; set; } [ObservableProperty] @@ -19,80 +27,50 @@ public partial class DeviceDetailViewModel : ViewModelBase,INavigatable [ObservableProperty] private VariableItemViewModel _selectedVariableTable; - public DeviceDetailViewModel(IDialogService dialogService,INavigationService navigationService, DataServices dataServices) + public DeviceDetailViewModel(IMapper mapper, IDialogService dialogService, INavigationService navigationService, + DataServices dataServices, IVariableTableAppService variableTableAppService) { + _mapper = mapper; _dialogService = dialogService; _navigationService = navigationService; + _variableTableAppService = variableTableAppService; DataServices = dataServices; } - public override void OnLoaded() - { - // Ensure VariableTables is an ObservableCollection for UI binding - // if (_curentDevice.VariableTables != null && - // !(_curentDevice.VariableTables is ObservableCollection)) - // { - // _curentDevice.VariableTables = new ObservableCollection(_curentDevice.VariableTables); - // } - // else if (_curentDevice.VariableTables == null) - // { - // _curentDevice.VariableTables = new ObservableCollection(); - // } - } - [RelayCommand] private async Task AddVariableTable() { - // using var db = DbContext.GetInstance(); - // try - // { - // // 1. Show dialog to get new variable table details - // var newVarTable = await _dialogService.ShowAddVarTableDialog(); - // if (newVarTable == null) return; // User cancelled - // - // // 2. Set properties for the new variable table - // newVarTable.DeviceId = CurrentDevice.Id; - // newVarTable.ProtocolType = CurrentDevice.ProtocolType; - // newVarTable.IsActive = true; - // - // // 3. Find the parent menu for the current device - // var parentMenu = DataServicesHelper.FindMenusForDevice(CurrentDevice, _dataServices.MenuTrees); - // if (parentMenu == null) - // { - // //NotificationHelper.ShowError("无法找到当前设备的父级菜单,无法添加变量表菜单。"); - // return; - // } - // - // // 4. Start database transaction - // await db.BeginTranAsync(); - // - // // 5. AddAsync variable table to the database - // var addedVarTable = await _varTableRepository.AddAsync(newVarTable, db); - // - // // 6. Create and add the corresponding menu item - // var newMenu = new MenuBean - // { - // Name = addedVarTable.Name, - // DataId = addedVarTable.Id, - // Type = MenuType.VariableTableMenu, - // ParentId = parentMenu.Id, - // Icon = iNKORE.UI.WPF.Modern.Common.IconKeys.SegoeFluentIcons.Tablet.Glyph - // }; - // await _menuRepository.AddAsync(newMenu, db); - // - // // 7. Commit transaction - // await db.CommitTranAsync(); - // - // // 8. Update UI - // CurrentDevice?.VariableTables?.Add(addedVarTable); - // MessageHelper.SendLoadMessage(Enums.LoadTypes.Menu); // Refresh the main navigation menu - // //NotificationHelper.ShowSuccess($"变量表 {addedVarTable.Name} 添加成功。"); - // } - // catch (Exception ex) - // { - // await db.RollbackTranAsync(); - // //NotificationHelper.ShowError($"添加变量表时发生错误: {ex.Message}", ex); - // } + try + { + VariableTableDialogViewModel variableTableDialogViewModel = new VariableTableDialogViewModel() + { + PrimaryButContent = "添加变量表" + }; + // 1. 显示添加设备对话框 + var variableTableItemViewModel = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); + // 如果用户取消或对话框未返回设备,则直接返回 + if (variableTableItemViewModel == null) + { + return; + } + + CreateVariableTableWithMenuDto createDto = new CreateVariableTableWithMenuDto(); + createDto.VariableTable = _mapper.Map(variableTableItemViewModel); + createDto.DeviceId = CurrentDevice.Id; + createDto.Menu = new MenuBeanDto() + { + Header = variableTableItemViewModel.Name, + Icon = SegoeFluentIcons.DataSense.Glyph + }; + CreateVariableTableWithMenuDto + resCreateDto = await _variableTableAppService.CreateVariableTableAsync(createDto); + DataServices.AddVariableTable(_mapper.Map(resCreateDto.VariableTable)); + DataServices.AddMenuItem(_mapper.Map(resCreateDto.Menu)); + } + catch (Exception ex) + { + NotificationHelper.ShowError($"添加变量表时发生错误: {ex.Message}", ex); + } } [RelayCommand] @@ -224,20 +202,20 @@ public partial class DeviceDetailViewModel : ViewModelBase,INavigatable public async Task OnNavigatedToAsync(MenuItemViewModel menu) { - var device= DataServices.Devices.FirstOrDefault(d => d.Id == menu.TargetId); - if (device!=null) - { - CurrentDevice = device; - } - + var device = DataServices.Devices.FirstOrDefault(d => d.Id == menu.TargetId); + if (device != null) + { + CurrentDevice = device; + } } [RelayCommand] public void NavigateToVariableTable() { if (SelectedVariableTable == null) return; - var menu=DataServices.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == SelectedVariableTable.Id); - if (menu==null) return; + var menu = DataServices.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && + m.TargetId == SelectedVariableTable.Id); + if (menu == null) return; _navigationService.NavigateToAsync(menu); } } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Dialogs/VarTableDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/VarTableDialogViewModel.cs deleted file mode 100644 index 8646ac0..0000000 --- a/DMS.WPF/ViewModels/Dialogs/VarTableDialogViewModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using DMS.WPF.ViewModels.Items; - -namespace DMS.WPF.ViewModels.Dialogs; - -public partial class VarTableDialogViewModel:ObservableObject -{ - [ObservableProperty] - private VariableTableItemViewModel variableTable; - [ObservableProperty] - private string title; - [ObservableProperty] - private string primaryButtonText; -} \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs new file mode 100644 index 0000000..346ff81 --- /dev/null +++ b/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs @@ -0,0 +1,36 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using DMS.WPF.ViewModels.Items; + +namespace DMS.WPF.ViewModels.Dialogs; + +public partial class VariableTableDialogViewModel:DialogViewModelBase +{ + [ObservableProperty] + private VariableTableItemViewModel _variableTable; + + public VariableTableDialogViewModel(VariableTableItemViewModel variableTable=null) + { + if (variableTable==null) + { + VariableTable = new VariableTableItemViewModel(); + } + else + { + VariableTable = variableTable; + } + } + + [RelayCommand] + public async void ParimaryButton() + { + + await Close(VariableTable); + } + [RelayCommand] + public async void CancleButton() + { + + await Close(null); + } +} \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs b/DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs index 8c1b624..35d18bd 100644 --- a/DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs +++ b/DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs @@ -17,7 +17,7 @@ public partial class VariableTableItemViewModel : ObservableObject private string _description; [ObservableProperty] - private bool _isActive; + private bool _isActive=true; [ObservableProperty] private int _deviceId; diff --git a/DMS.WPF/Views/Dialogs/VarTableDialog.xaml b/DMS.WPF/Views/Dialogs/VariableTableDialog.xaml similarity index 60% rename from DMS.WPF/Views/Dialogs/VarTableDialog.xaml rename to DMS.WPF/Views/Dialogs/VariableTableDialog.xaml index 80f0607..95ced43 100644 --- a/DMS.WPF/Views/Dialogs/VarTableDialog.xaml +++ b/DMS.WPF/Views/Dialogs/VariableTableDialog.xaml @@ -1,25 +1,30 @@ - - + + + + + + + + - - - @@ -34,6 +39,12 @@ + + + - + \ No newline at end of file diff --git a/DMS.WPF/Views/Dialogs/VarTableDialog.xaml.cs b/DMS.WPF/Views/Dialogs/VariableTableDialog.xaml.cs similarity index 50% rename from DMS.WPF/Views/Dialogs/VarTableDialog.xaml.cs rename to DMS.WPF/Views/Dialogs/VariableTableDialog.xaml.cs index 8b0e22a..5115536 100644 --- a/DMS.WPF/Views/Dialogs/VarTableDialog.xaml.cs +++ b/DMS.WPF/Views/Dialogs/VariableTableDialog.xaml.cs @@ -3,11 +3,10 @@ using iNKORE.UI.WPF.Modern.Controls; namespace DMS.WPF.Views.Dialogs; -public partial class VarTableDialog : ContentDialog +public partial class VariableTableDialog : ContentDialog { - public VarTableDialog(VarTableDialogViewModel viewModel) + public VariableTableDialog() { InitializeComponent(); - this.DataContext = viewModel; } } \ No newline at end of file