diff --git a/DMS.Application/DTOs/Triggers/TriggerDefinitionDto.cs b/DMS.Application/DTOs/Triggers/TriggerDefinitionDto.cs index 2d56723..7d7f348 100644 --- a/DMS.Application/DTOs/Triggers/TriggerDefinitionDto.cs +++ b/DMS.Application/DTOs/Triggers/TriggerDefinitionDto.cs @@ -11,12 +11,12 @@ namespace DMS.Application.DTOs.Triggers /// /// 触发器唯一标识符 /// - public Guid Id { get; set; } + public int Id { get; set; } /// /// 关联的变量 ID /// - public Guid VariableId { get; set; } + public int VariableId { get; set; } /// /// 触发器是否处于激活状态 diff --git a/DMS.Application/Profiles/MappingProfile.cs b/DMS.Application/Profiles/MappingProfile.cs index 5501201..c863d5d 100644 --- a/DMS.Application/Profiles/MappingProfile.cs +++ b/DMS.Application/Profiles/MappingProfile.cs @@ -1,6 +1,8 @@ using AutoMapper; using DMS.Core.Models; using DMS.Application.DTOs; +using DMS.Application.DTOs.Triggers; +using DMS.Core.Models.Triggers; namespace DMS.Application.Profiles; @@ -56,5 +58,6 @@ public class MappingProfile : Profile CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } diff --git a/DMS.Application/Services/Triggers/ITriggerManagementService.cs b/DMS.Application/Services/Triggers/ITriggerManagementService.cs index e76b925..4d956cf 100644 --- a/DMS.Application/Services/Triggers/ITriggerManagementService.cs +++ b/DMS.Application/Services/Triggers/ITriggerManagementService.cs @@ -21,7 +21,7 @@ namespace DMS.Application.Services.Triggers /// /// 触发器 ID /// 触发器定义 DTO,如果未找到则返回 null - Task GetTriggerByIdAsync(Guid id); + Task GetTriggerByIdAsync(int id); /// /// 创建一个新的触发器定义 @@ -36,20 +36,20 @@ namespace DMS.Application.Services.Triggers /// 要更新的触发器 ID /// 包含更新信息的触发器定义 DTO /// 更新后的触发器定义 DTO,如果未找到则返回 null - Task UpdateTriggerAsync(Guid id, TriggerDefinitionDto triggerDto); + Task UpdateTriggerAsync(int id, TriggerDefinitionDto triggerDto); /// /// 删除一个触发器定义 /// /// 要删除的触发器 ID /// 删除成功返回 true,否则返回 false - Task DeleteTriggerAsync(Guid id); + Task DeleteTriggerAsync(int id); /// /// 获取与指定变量关联的所有触发器定义 /// /// 变量 ID /// 该变量关联的触发器定义列表 - Task> GetTriggersForVariableAsync(Guid variableId); + Task> GetTriggersForVariableAsync(int variableId); } } \ No newline at end of file diff --git a/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs b/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs index 82eacd3..1fb3a2c 100644 --- a/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs +++ b/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs @@ -23,7 +23,7 @@ namespace DMS.Application.Services.Triggers.Impl private readonly ITriggerActionExecutor _actionExecutor; private readonly ILogger _logger; // 使用标准日志接口 // 为每个触发器存储抑制定时器 - private readonly ConcurrentDictionary _suppressionTimers = new(); + private readonly ConcurrentDictionary _suppressionTimers = new(); public TriggerEvaluationService( ITriggerManagementService triggerManagementService, diff --git a/DMS.Application/Services/Triggers/Impl/TriggerManagementService.cs b/DMS.Application/Services/Triggers/Impl/TriggerManagementService.cs index 9f09a27..c68a70a 100644 --- a/DMS.Application/Services/Triggers/Impl/TriggerManagementService.cs +++ b/DMS.Application/Services/Triggers/Impl/TriggerManagementService.cs @@ -35,7 +35,7 @@ namespace DMS.Application.Services.Triggers.Impl /// /// 根据 ID 获取触发器定义 /// - public async Task GetTriggerByIdAsync(Guid id) + public async Task GetTriggerByIdAsync(int id) { var trigger = await _repositoryManager.Triggers.GetByIdAsync(id); return trigger != null ? _mapper.Map(trigger) : null; @@ -64,7 +64,7 @@ namespace DMS.Application.Services.Triggers.Impl /// /// 更新一个已存在的触发器定义 /// - public async Task UpdateTriggerAsync(Guid id, TriggerDefinitionDto triggerDto) + public async Task UpdateTriggerAsync(int id, TriggerDefinitionDto triggerDto) { // 1. 获取现有实体 var existingTrigger = await _repositoryManager.Triggers.GetByIdAsync(id); @@ -90,7 +90,7 @@ namespace DMS.Application.Services.Triggers.Impl /// /// 删除一个触发器定义 /// - public async Task DeleteTriggerAsync(Guid id) + public async Task DeleteTriggerAsync(int id) { return await _repositoryManager.Triggers.DeleteAsync(id); } @@ -98,7 +98,7 @@ namespace DMS.Application.Services.Triggers.Impl /// /// 获取与指定变量关联的所有触发器定义 /// - public async Task> GetTriggersForVariableAsync(Guid variableId) + public async Task> GetTriggersForVariableAsync(int variableId) { var triggers = await _repositoryManager.Triggers.GetByVariableIdAsync(variableId); return _mapper.Map>(triggers); diff --git a/DMS.Application/Services/VariableTableManagementService.cs b/DMS.Application/Services/VariableTableManagementService.cs index 32f877d..3a18f87 100644 --- a/DMS.Application/Services/VariableTableManagementService.cs +++ b/DMS.Application/Services/VariableTableManagementService.cs @@ -83,21 +83,31 @@ public class VariableTableManagementService : IVariableTableManagementService return; DeviceDto deviceDto = null; - if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) + if (_appDataStorageService.Devices != null && + _appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var device)) { deviceDto = device; // 确保VariableTables不为null - device.VariableTables ??= new List(); + if (device.VariableTables == null) + device.VariableTables = new List(); + device.VariableTables.Add(variableTableDto); - variableTableDto.Device = device; + + // 确保Device属性不为null + if (variableTableDto != null) + variableTableDto.Device = device; } - if (_variableTables.TryAdd(variableTableDto.Id, variableTableDto)) + // 确保_variableTables和variableTableDto不为null + if (_variableTables != null && variableTableDto != null) { - OnVariableTableChanged?.Invoke(this,new VariableTableChangedEventArgs( - DataChangeType.Added, - variableTableDto, - deviceDto)); + if (_variableTables.TryAdd(variableTableDto.Id, variableTableDto)) + { + OnVariableTableChanged?.Invoke(this, new VariableTableChangedEventArgs( + DataChangeType.Added, + variableTableDto, + deviceDto)); + } } } diff --git a/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs b/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs index 81a3efe..71699df 100644 --- a/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs +++ b/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs @@ -21,7 +21,7 @@ namespace DMS.Core.Interfaces.Repositories.Triggers /// /// 触发器 ID /// 触发器定义实体,如果未找到则返回 null - Task GetByIdAsync(Guid id); + Task GetByIdAsync(int id); /// /// 添加一个新的触发器定义 @@ -42,13 +42,13 @@ namespace DMS.Core.Interfaces.Repositories.Triggers /// /// 要删除的触发器 ID /// 删除成功返回 true,否则返回 false - Task DeleteAsync(Guid id); + Task DeleteAsync(int id); /// /// 获取与指定变量关联的所有触发器定义 /// /// 变量 ID /// 该变量关联的触发器定义实体列表 - Task> GetByVariableIdAsync(Guid variableId); + Task> GetByVariableIdAsync(int variableId); } } \ No newline at end of file diff --git a/DMS.Core/Models/Triggers/TriggerDefinition.cs b/DMS.Core/Models/Triggers/TriggerDefinition.cs index 4bc3890..852d070 100644 --- a/DMS.Core/Models/Triggers/TriggerDefinition.cs +++ b/DMS.Core/Models/Triggers/TriggerDefinition.cs @@ -34,12 +34,12 @@ namespace DMS.Core.Models.Triggers /// /// 触发器唯一标识符 /// - public Guid Id { get; set; } = Guid.NewGuid(); + public int Id { get; set; } /// /// 关联的变量 ID /// - public Guid VariableId { get; set; } + public int VariableId { get; set; } /// /// 触发器是否处于激活状态 diff --git a/DMS.Infrastructure/Entities/DbTriggerDefinition.cs b/DMS.Infrastructure/Entities/DbTriggerDefinition.cs index bc2ad3d..ce842bb 100644 --- a/DMS.Infrastructure/Entities/DbTriggerDefinition.cs +++ b/DMS.Infrastructure/Entities/DbTriggerDefinition.cs @@ -14,13 +14,13 @@ public class DbTriggerDefinition /// /// 触发器唯一标识符,主键。 /// - [SugarColumn(IsPrimaryKey = true)] - public Guid Id { get; set; } + [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } /// /// 关联的变量 ID。 /// - public Guid VariableId { get; set; } + public int VariableId { get; set; } /// /// 触发器是否处于激活状态。 diff --git a/DMS.Infrastructure/Repositories/BaseRepository.cs b/DMS.Infrastructure/Repositories/BaseRepository.cs index 16f506f..a1a937b 100644 --- a/DMS.Infrastructure/Repositories/BaseRepository.cs +++ b/DMS.Infrastructure/Repositories/BaseRepository.cs @@ -100,10 +100,12 @@ public abstract class BaseRepository return entities; } + + /// - /// 异步根据主键 ID 获取单个实体。 + /// 异步根据主键 ID (int类型) 获取单个实体。 /// - /// 实体的主键 ID。 + /// 实体的主键 ID (int类型)。 /// 返回找到的实体,如果未找到则返回 null。 public virtual async Task GetByIdAsync(int id) { diff --git a/DMS.Infrastructure/Repositories/TriggerRepository.cs b/DMS.Infrastructure/Repositories/TriggerRepository.cs index c482a89..f04d131 100644 --- a/DMS.Infrastructure/Repositories/TriggerRepository.cs +++ b/DMS.Infrastructure/Repositories/TriggerRepository.cs @@ -40,7 +40,7 @@ namespace DMS.Infrastructure.Repositories /// /// 根据 ID 获取触发器定义 /// - public async Task GetByIdAsync(Guid id) + public async Task GetByIdAsync(int id) { var dbTrigger = await base.GetByIdAsync(id); return _mapper.Map(dbTrigger); @@ -67,7 +67,7 @@ namespace DMS.Infrastructure.Repositories /// /// 删除一个触发器定义 /// - public async Task DeleteAsync(Guid id) + public async Task DeleteAsync(int id) { var stopwatch = new Stopwatch(); stopwatch.Start(); @@ -82,7 +82,7 @@ namespace DMS.Infrastructure.Repositories /// /// 获取与指定变量关联的所有触发器定义 /// - public async Task> GetByVariableIdAsync(Guid variableId) + public async Task> GetByVariableIdAsync(int variableId) { var stopwatch = new Stopwatch(); stopwatch.Start(); diff --git a/DMS.WPF/Services/DeviceDataService.cs b/DMS.WPF/Services/DeviceDataService.cs index 0f14df0..db89507 100644 --- a/DMS.WPF/Services/DeviceDataService.cs +++ b/DMS.WPF/Services/DeviceDataService.cs @@ -85,42 +85,67 @@ public class DeviceDataService : IDeviceDataService /// public async Task AddDevice(CreateDeviceWithDetailsDto dto) { + // 添加null检查 + if (dto == null || _appDataCenterService == null || _appDataCenterService.DeviceManagementService == null) + return null; + var addDto = await _appDataCenterService.DeviceManagementService.CreateDeviceWithDetailsAsync(dto); - //更新当前界面 - _dataStorageService.Devices.Add(_mapper.Map(addDto.Device)); - _menuDataService.AddMenuItem(_mapper.Map(addDto.DeviceMenu)); // 添加null检查 - if (addDto.VariableTable != null) + if (_dataStorageService != null && addDto != null && addDto.Device != null) + { + //更新当前界面 + _dataStorageService.Devices.Add(_mapper.Map(addDto.Device)); + } + + // 添加null检查 + if (_menuDataService != null && addDto != null && addDto.DeviceMenu != null) + { + _menuDataService.AddMenuItem(_mapper.Map(addDto.DeviceMenu)); + } + + // 添加null检查 + if (addDto != null && addDto.VariableTable != null) { await _variableDataService.AddVariableTable(addDto.VariableTable); } // 添加null检查 - if (addDto.VariableTableMenu != null) + if (_menuDataService != null && addDto != null && addDto.VariableTableMenu != null) { _menuDataService.AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); } - //更新数据中心 - _appDataCenterService.DeviceManagementService.AddDeviceToMemory(addDto.Device); + // 添加null检查 + if (_appDataCenterService.DeviceManagementService != null && addDto != null && addDto.Device != null) + { + //更新数据中心 + _appDataCenterService.DeviceManagementService.AddDeviceToMemory(addDto.Device); + } // 添加null检查 - if (addDto.VariableTable != null) + if (_appDataCenterService.VariableTableManagementService != null && addDto != null && addDto.VariableTable != null) { _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(addDto.VariableTable); } - _appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.DeviceMenu); + // 添加null检查 + if (_appDataCenterService.MenuManagementService != null && addDto != null && addDto.DeviceMenu != null) + { + _appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.DeviceMenu); + } // 添加null检查 - if (addDto.VariableTableMenu != null) + if (_appDataCenterService.MenuManagementService != null && addDto != null && addDto.VariableTableMenu != null) { _appDataCenterService.MenuManagementService.AddMenuToMemory(addDto.VariableTableMenu); } - _menuDataService.BuildMenuTrees(); - + // 添加null检查 + if (_menuDataService != null) + { + _menuDataService.BuildMenuTrees(); + } return addDto; } diff --git a/DMS.WPF/Services/VariableDataService.cs b/DMS.WPF/Services/VariableDataService.cs index d8e0b13..a9edf8a 100644 --- a/DMS.WPF/Services/VariableDataService.cs +++ b/DMS.WPF/Services/VariableDataService.cs @@ -51,20 +51,39 @@ public class VariableDataService : IVariableDataService public async Task AddVariableTable(VariableTableDto variableTableDto, MenuBeanDto menuDto = null, bool isAddDb = false) { + // 添加null检查 if (variableTableDto == null) return false; + // 添加_appDataCenterService和_variableTableManagementService的null检查 + if (_appDataCenterService == null || _appDataCenterService.VariableTableManagementService == null) + return false; + if (isAddDb && menuDto != null) { + // 添加null检查 + if (_appDataCenterService.VariableTableManagementService == null) + return false; + CreateVariableTableWithMenuDto createDto = new CreateVariableTableWithMenuDto(); createDto.VariableTable = variableTableDto; createDto.DeviceId = variableTableDto.DeviceId; createDto.Menu = menuDto; + + // 添加null检查 + if (_appDataCenterService.VariableTableManagementService == null) + return false; + var resDto = await _appDataCenterService.VariableTableManagementService.CreateVariableTableAsync(createDto); - _mapper.Map(resDto.VariableTable, variableTableDto); + + // 添加null检查 + if (resDto != null && resDto.VariableTable != null && variableTableDto != null) + _mapper.Map(resDto.VariableTable, variableTableDto); } - _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(variableTableDto); + // 添加null检查 + if (_appDataCenterService.VariableTableManagementService != null && variableTableDto != null) + _appDataCenterService.VariableTableManagementService.AddVariableTableToMemory(variableTableDto); return true; } diff --git a/DMS.WPF/ViewModels/DevicesViewModel.cs b/DMS.WPF/ViewModels/DevicesViewModel.cs index 0b9c67f..22a3899 100644 --- a/DMS.WPF/ViewModels/DevicesViewModel.cs +++ b/DMS.WPF/ViewModels/DevicesViewModel.cs @@ -89,7 +89,16 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable CreateDeviceWithDetailsDto dto = new CreateDeviceWithDetailsDto(); - dto.Device = _mapper.Map(device); + // 添加null检查 + if (_mapper != null) + { + dto.Device = _mapper.Map(device); + } + else + { + _notificationService?.ShowError("映射服务未初始化"); + return; + } dto.DeviceMenu = new MenuBeanDto() @@ -98,6 +107,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable Icon = SegoeFluentIcons.Devices2.Glyph, TargetViewKey = "DeviceDetailView" }; + if (device.IsAddDefVarTable) { dto.VariableTable = new VariableTableDto() @@ -116,14 +126,34 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable // 添加设备 - var addDto = await _wpfDataService.DeviceDataService.AddDevice(dto); - - _notificationService.ShowSuccess($"设备添加成功:{addDto.Device.Name}"); + // 添加null检查 + if (_wpfDataService != null && _wpfDataService.DeviceDataService != null) + { + var addDto = await _wpfDataService.DeviceDataService.AddDevice(dto); + + // 添加null检查 + if (addDto != null && addDto.Device != null && _notificationService != null) + { + _notificationService.ShowSuccess($"设备添加成功:{addDto.Device.Name}"); + } + else if (_notificationService != null) + { + _notificationService.ShowError("设备添加失败"); + } + } + else if (_notificationService != null) + { + _notificationService.ShowError("数据服务未初始化"); + } } catch (Exception e) { Console.WriteLine(e); - _notificationService.ShowError($"添加设备的过程中发生错误:{e.Message}", e); + // 添加null检查 + if (_notificationService != null) + { + _notificationService.ShowError($"添加设备的过程中发生错误:{e.Message}", e); + } } } diff --git a/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs index 287ace7..10ed01d 100644 --- a/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs @@ -54,7 +54,7 @@ namespace DMS.WPF.ViewModels.Dialogs if (parameter is TriggerDefinitionDto triggerDto) { Trigger = triggerDto; - Title = Trigger.Id == Guid.Empty ? "新建触发器" : "编辑触发器"; + Title = Trigger.Id == default(int) ? "新建触发器" : "编辑触发器"; PrimaryButText = "保存"; // Load available variables for selection dropdown @@ -109,7 +109,7 @@ namespace DMS.WPF.ViewModels.Dialogs private async Task SaveAsync() { // Basic validation - if (Trigger.VariableId == Guid.Empty) + if (Trigger.VariableId == default(int)) { _notificationService.ShowWarn("请选择关联的变量"); return; @@ -187,10 +187,10 @@ namespace DMS.WPF.ViewModels.Dialogs // Set timestamps Trigger.UpdatedAt = DateTime.UtcNow; - if (Trigger.Id == Guid.Empty) + if (Trigger.Id == default(int)) { Trigger.CreatedAt = DateTime.UtcNow; - Trigger.Id = Guid.NewGuid(); + Trigger.Id = 0; // 对于自增ID,设置为0让数据库自动生成 } // Close dialog with the updated trigger DTO diff --git a/DMS.WPF/ViewModels/TriggersViewModel.cs b/DMS.WPF/ViewModels/TriggersViewModel.cs index 62e1691..d087eec 100644 --- a/DMS.WPF/ViewModels/TriggersViewModel.cs +++ b/DMS.WPF/ViewModels/TriggersViewModel.cs @@ -63,7 +63,6 @@ namespace DMS.WPF.ViewModels.Triggers { var newTrigger = new TriggerDefinitionDto { - Id = Guid.NewGuid(), IsActive = true, Condition = Core.Models.Triggers.ConditionType.GreaterThan, Action = Core.Models.Triggers.ActionType.SendEmail,