diff --git a/DMS.Application/Interfaces/Database/ITriggerAppService.cs b/DMS.Application/Interfaces/Database/ITriggerAppService.cs index 77296a2..3b2c7f9 100644 --- a/DMS.Application/Interfaces/Database/ITriggerAppService.cs +++ b/DMS.Application/Interfaces/Database/ITriggerAppService.cs @@ -14,27 +14,27 @@ namespace DMS.Application.Interfaces.Database /// /// 触发器ID。 /// 触发器定义实体。 - Task GetTriggerByIdAsync(int id); + Task GetTriggerByIdAsync(int id); /// /// 异步获取所有触发器定义。 /// /// 触发器定义实体列表。 - Task> GetAllTriggersAsync(); + Task> GetAllTriggersAsync(); /// /// 异步创建一个新触发器定义及其关联的变量ID。 /// /// 要创建的触发器定义。 /// 新创建的触发器定义。 - Task CreateTriggerAsync(TriggerDefinition trigger); + Task CreateTriggerAsync(Trigger trigger); /// /// 异步更新一个已存在的触发器定义及其关联的变量ID。 /// /// 要更新的触发器定义。 /// 受影响的行数。 - Task UpdateTriggerAsync(TriggerDefinition trigger); + Task UpdateTriggerAsync(Trigger trigger); /// /// 异步删除一个触发器定义及其关联的变量关系。 @@ -48,6 +48,6 @@ namespace DMS.Application.Interfaces.Database /// /// 变量ID。 /// 与指定变量关联的触发器定义实体列表。 - Task> GetTriggersByVariableIdAsync(int variableId); + Task> GetTriggersByVariableIdAsync(int variableId); } } \ No newline at end of file diff --git a/DMS.Application/Interfaces/IAppStorageService.cs b/DMS.Application/Interfaces/IAppStorageService.cs index 2c1e9af..34d50bb 100644 --- a/DMS.Application/Interfaces/IAppStorageService.cs +++ b/DMS.Application/Interfaces/IAppStorageService.cs @@ -49,7 +49,7 @@ public interface IAppStorageService /// /// 安全字典,用于存储所有触发器定义数据 /// - ConcurrentDictionary Triggers { get; } + ConcurrentDictionary Triggers { get; } /// /// 安全字典,用于存储所有触发器与变量关联数据 diff --git a/DMS.Application/Interfaces/Management/ITriggerManagementService.cs b/DMS.Application/Interfaces/Management/ITriggerManagementService.cs index 0f8fef7..c820276 100644 --- a/DMS.Application/Interfaces/Management/ITriggerManagementService.cs +++ b/DMS.Application/Interfaces/Management/ITriggerManagementService.cs @@ -12,21 +12,21 @@ namespace DMS.Application.Interfaces.Management /// 获取所有触发器定义 /// /// 触发器定义列表 - List GetAllTriggersAsync(); + List GetAllTriggersAsync(); /// /// 根据 ID 获取触发器定义 /// /// 触发器 ID /// 触发器定义 DTO,如果未找到则返回 null - Task GetTriggerByIdAsync(int id); + Task GetTriggerByIdAsync(int id); /// /// 创建一个新的触发器定义 /// /// 要创建的触发器定义 DTO /// 创建成功的触发器定义 DTO - Task CreateTriggerAsync(TriggerDefinition triggerDto); + Task CreateTriggerAsync(Trigger triggerDto); /// /// 更新一个已存在的触发器定义 @@ -34,7 +34,7 @@ namespace DMS.Application.Interfaces.Management /// 要更新的触发器 ID /// 包含更新信息的触发器定义 DTO /// 更新后的触发器定义 DTO,如果未找到则返回 null - Task UpdateTriggerAsync(int id, TriggerDefinition triggerDto); + Task UpdateTriggerAsync(int id, Trigger triggerDto); /// /// 删除一个触发器定义 @@ -48,7 +48,7 @@ namespace DMS.Application.Interfaces.Management /// /// 变量 ID /// 该变量关联的触发器定义列表 - Task> GetTriggersForVariableAsync(int variableId); + Task> GetTriggersForVariableAsync(int variableId); /// /// 异步加载所有触发器数据 diff --git a/DMS.Application/Services/AppStorageService.cs b/DMS.Application/Services/AppStorageService.cs index 0164e41..f7f8ff5 100644 --- a/DMS.Application/Services/AppStorageService.cs +++ b/DMS.Application/Services/AppStorageService.cs @@ -58,7 +58,7 @@ public class AppStorageService : IAppStorageService /// /// 安全字典,用于存储所有触发器定义数据 /// - public ConcurrentDictionary Triggers { get; } = new(); + public ConcurrentDictionary Triggers { get; } = new(); /// /// 安全字典,用于存储所有触发器与变量关联数据 diff --git a/DMS.Application/Services/DataLoaderService.cs b/DMS.Application/Services/DataLoaderService.cs index 25a9bad..d2286d5 100644 --- a/DMS.Application/Services/DataLoaderService.cs +++ b/DMS.Application/Services/DataLoaderService.cs @@ -16,6 +16,7 @@ public class DataLoaderService : IDataLoaderService { private readonly IMqttManagementService _mqttManagementService; private readonly IMqttAliasManagementService _mqttAliasManagementService; + private readonly ITriggerVariableManagementService _triggerVariableManagementService; private readonly ITriggerManagementService _triggerManagementService; // 添加触发器管理服务 private readonly IEventService _eventService; // 添加事件服务 private readonly IDeviceManagementService _deviceManagementService; // 添加设备管理服务 @@ -29,6 +30,7 @@ public class DataLoaderService : IDataLoaderService public const int LoadLogCount =100; public DataLoaderService(IMqttManagementService mqttManagementService, IMqttAliasManagementService mqttAliasManagementService, + ITriggerVariableManagementService triggerVariableManagementService, ITriggerManagementService triggerManagementService, // 添加触发器管理服务参数 IEventService eventService, // 添加事件服务参数 IDeviceManagementService deviceManagementService, // 添加设备管理服务参数 @@ -39,6 +41,7 @@ public class DataLoaderService : IDataLoaderService { _mqttManagementService = mqttManagementService; _mqttAliasManagementService = mqttAliasManagementService; + _triggerVariableManagementService = triggerVariableManagementService; _triggerManagementService = triggerManagementService; // 初始化触发器管理服务 _eventService = eventService; // 初始化事件服务 _deviceManagementService = deviceManagementService; // 初始化设备管理服务 @@ -74,6 +77,8 @@ public class DataLoaderService : IDataLoaderService // 加载所有触发器 await _triggerManagementService.LoadAllTriggersAsync(); + // 加载触发器和变量的关联 + await _triggerVariableManagementService.LoadAllTriggerVariablesAsync(); _eventService.RaiseLoadDataCompleted(this, new DataLoadCompletedEventArgs(true, "数据加载成功")); } diff --git a/DMS.Application/Services/Database/TriggerAppService.cs b/DMS.Application/Services/Database/TriggerAppService.cs index 2ebe138..2f12893 100644 --- a/DMS.Application/Services/Database/TriggerAppService.cs +++ b/DMS.Application/Services/Database/TriggerAppService.cs @@ -33,7 +33,7 @@ namespace DMS.Application.Services.Database /// /// 触发器ID。 /// 触发器定义实体。 - public async Task GetTriggerByIdAsync(int id) + public async Task GetTriggerByIdAsync(int id) { var dbTrigger = await _repositoryManager.Triggers.GetByIdAsync(id); return dbTrigger; @@ -43,7 +43,7 @@ namespace DMS.Application.Services.Database /// 异步获取所有触发器定义。 /// /// 触发器定义实体列表。 - public async Task> GetAllTriggersAsync() + public async Task> GetAllTriggersAsync() { var triggers = await _repositoryManager.Triggers.GetAllAsync(); var triggerVariables = await _repositoryManager.TriggerVariables.GetAllAsync(); @@ -62,7 +62,7 @@ namespace DMS.Application.Services.Database /// /// 要创建的触发器定义。 /// 新创建的触发器定义。 - public async Task CreateTriggerAsync(TriggerDefinition trigger) + public async Task CreateTriggerAsync(Trigger trigger) { try { @@ -99,7 +99,7 @@ namespace DMS.Application.Services.Database /// /// 要更新的触发器定义。 /// 受影响的行数。 - public async Task UpdateTriggerAsync(TriggerDefinition trigger) + public async Task UpdateTriggerAsync(Trigger trigger) { try { @@ -169,7 +169,7 @@ namespace DMS.Application.Services.Database /// /// 变量ID。 /// 与指定变量关联的触发器定义实体列表。 - public async Task> GetTriggersByVariableIdAsync(int variableId) + public async Task> GetTriggersByVariableIdAsync(int variableId) { var stopwatch = new Stopwatch(); stopwatch.Start(); @@ -177,7 +177,7 @@ namespace DMS.Application.Services.Database // // 获取关联的触发器ID列表 // var triggerIds = await _repositoryManager.GetTriggerIdsByVariableIdAsync(variableId); - // var triggers = new List(); + // var triggers = new List(); // if (triggerIds.Any()) // { // // 获取所有关联的触发器 diff --git a/DMS.Application/Services/Management/TriggerManagementService.cs b/DMS.Application/Services/Management/TriggerManagementService.cs index 211c92d..a6f6234 100644 --- a/DMS.Application/Services/Management/TriggerManagementService.cs +++ b/DMS.Application/Services/Management/TriggerManagementService.cs @@ -27,16 +27,16 @@ namespace DMS.Application.Services.Management /// /// 获取所有触发器定义 /// - public List GetAllTriggersAsync() + public List GetAllTriggersAsync() { var triggers = _appStorageService.Triggers.Values.ToList(); - return _mapper.Map>(triggers); + return _mapper.Map>(triggers); } /// /// 根据 ID 获取触发器定义 /// - public async Task GetTriggerByIdAsync(int id) + public async Task GetTriggerByIdAsync(int id) { _appStorageService.Triggers.TryGetValue(id, out var trigger); return trigger; @@ -46,13 +46,13 @@ namespace DMS.Application.Services.Management /// /// 创建一个新的触发器定义 /// - public async Task CreateTriggerAsync(TriggerDefinition triggerDto) + public async Task CreateTriggerAsync(Trigger triggerDto) { // 1. 验证 DTO (可以在应用层或领域层做) ValidateTriggerDto(triggerDto); // 2. 转换 DTO 到实体 - var triggerEntity = _mapper.Map(triggerDto); + var triggerEntity = _mapper.Map(triggerDto); triggerEntity.CreatedAt = DateTime.UtcNow; triggerEntity.UpdatedAt = DateTime.UtcNow; @@ -60,7 +60,7 @@ namespace DMS.Application.Services.Management var createdTrigger = await _repositoryManager.Triggers.AddAsync(triggerEntity); // 4. 转换回 DTO 并返回 - var result = _mapper.Map(createdTrigger); + var result = _mapper.Map(createdTrigger); // 5. 同步更新AppDataStorageService中的Triggers字典 _appStorageService.Triggers[result.Id] = result; @@ -71,7 +71,7 @@ namespace DMS.Application.Services.Management /// /// 更新一个已存在的触发器定义 /// - public async Task UpdateTriggerAsync(int id, TriggerDefinition triggerDto) + public async Task UpdateTriggerAsync(int id, Trigger triggerDto) { // 1. 获取现有实体 var existingTrigger = await _repositoryManager.Triggers.GetByIdAsync(id); @@ -91,7 +91,7 @@ namespace DMS.Application.Services.Management return null; // 5. 转换回 DTO 并返回 - var result = _mapper.Map(updatedTrigger); + var result = _mapper.Map(updatedTrigger); // 6. 同步更新AppDataStorageService中的Triggers字典 _appStorageService.Triggers[result.Id] = result; @@ -119,10 +119,10 @@ namespace DMS.Application.Services.Management /// /// 获取与指定变量关联的所有触发器定义 /// - public async Task> GetTriggersForVariableAsync(int variableId) + public async Task> GetTriggersForVariableAsync(int variableId) { // var triggers = await _repositoryManager.Triggers.GetByVariableIdAsync(variableId); - // return _mapper.Map>(triggers); + // return _mapper.Map>(triggers); return null; } @@ -141,9 +141,9 @@ namespace DMS.Application.Services.Management } /// - /// 内部方法:验证 TriggerDefinition 的有效性 + /// 内部方法:验证 Trigger 的有效性 /// - private void ValidateTriggerDto(TriggerDefinition dto) + private void ValidateTriggerDto(Trigger dto) { // 检查是否至少关联了一个变量 if (dto.Variables == null || !dto.Variables.Any()) diff --git a/DMS.Application/Services/Management/TriggerVariableManagementService.cs b/DMS.Application/Services/Management/TriggerVariableManagementService.cs index eb232cb..be88e23 100644 --- a/DMS.Application/Services/Management/TriggerVariableManagementService.cs +++ b/DMS.Application/Services/Management/TriggerVariableManagementService.cs @@ -50,6 +50,7 @@ public class TriggerVariableManagementService : ITriggerVariableManagementServic if (_appStorageService.Variables.TryGetValue(triggerVariable.VariableId, out var variable)) { trigger.Variables.Add(variable); + variable.Triggers.Add(trigger); } } diff --git a/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs b/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs index 13011b1..c6f8983 100644 --- a/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs +++ b/DMS.Application/Services/Triggers/Impl/TriggerEvaluationService.cs @@ -101,7 +101,7 @@ namespace DMS.Application.Services.Triggers.Impl /// /// 内部方法:评估单个触发器的条件 /// - private bool EvaluateCondition(TriggerDefinition trigger, object currentValueObj) + private bool EvaluateCondition(Trigger trigger, object currentValueObj) { if (currentValueObj == null) { @@ -139,7 +139,7 @@ namespace DMS.Application.Services.Triggers.Impl /// /// 内部方法:检查触发器是否处于抑制窗口期内 /// - private bool IsWithinSuppressionWindow(TriggerDefinition trigger) + private bool IsWithinSuppressionWindow(Trigger trigger) { if (!trigger.SuppressionDuration.HasValue || !trigger.LastTriggeredAt.HasValue) return false; diff --git a/DMS.Application/Services/Triggers/TriggerContext.cs b/DMS.Application/Services/Triggers/TriggerContext.cs index cc5f084..5184e83 100644 --- a/DMS.Application/Services/Triggers/TriggerContext.cs +++ b/DMS.Application/Services/Triggers/TriggerContext.cs @@ -11,5 +11,5 @@ namespace DMS.Application.Services.Triggers /// 被触发的触发器定义 /// 触发时变量的当前值 /// 关联的变量信息 - public record TriggerContext(TriggerDefinition Trigger, object CurrentValue, Variable Variable); + public record TriggerContext(Trigger Trigger, object CurrentValue, Variable Variable); } \ No newline at end of file diff --git a/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs b/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs index 0304336..f2ee511 100644 --- a/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs +++ b/DMS.Core/Interfaces/Repositories/Triggers/ITriggerRepository.cs @@ -7,9 +7,9 @@ using DMS.Core.Interfaces.Repositories; namespace DMS.Core.Interfaces.Repositories.Triggers { /// - /// 触发器仓储接口 (定义对 TriggerDefinition 实体的数据访问方法) + /// 触发器仓储接口 (定义对 Trigger 实体的数据访问方法) /// - public interface ITriggerRepository : IBaseRepository + public interface ITriggerRepository : IBaseRepository { } } \ No newline at end of file diff --git a/DMS.Core/Models/Triggers/TriggerDefinition.cs b/DMS.Core/Models/Triggers/Trigger.cs similarity index 98% rename from DMS.Core/Models/Triggers/TriggerDefinition.cs rename to DMS.Core/Models/Triggers/Trigger.cs index 5b32941..e917520 100644 --- a/DMS.Core/Models/Triggers/TriggerDefinition.cs +++ b/DMS.Core/Models/Triggers/Trigger.cs @@ -30,7 +30,7 @@ namespace DMS.Core.Models.Triggers /// /// 触发器定义领域模型 /// - public class TriggerDefinition + public class Trigger { /// /// 触发器唯一标识符 diff --git a/DMS.Core/Models/Variable.cs b/DMS.Core/Models/Variable.cs index 1085677..81bf207 100644 --- a/DMS.Core/Models/Variable.cs +++ b/DMS.Core/Models/Variable.cs @@ -1,6 +1,7 @@ using DMS.Core.Enums; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; +using DMS.Core.Models.Triggers; namespace DMS.Core.Models; @@ -58,6 +59,10 @@ public class Variable /// 此变量的所有MQTT发布别名关联。一个变量可以关联多个MQTT服务器,每个关联可以有独立的别名。 /// public List MqttAliases { get; set; } = new(); + /// + /// 此变量的所有触发器关联。一个变量可以关联多个触发器 + /// + public List Triggers { get; set; } = new(); /// /// OPC UA NodeId (仅当 Protocol 为 OpcUa 时有效)。 diff --git a/DMS.Infrastructure/Profiles/MappingProfile.cs b/DMS.Infrastructure/Profiles/MappingProfile.cs index fb5a958..ce7aa6a 100644 --- a/DMS.Infrastructure/Profiles/MappingProfile.cs +++ b/DMS.Infrastructure/Profiles/MappingProfile.cs @@ -45,7 +45,7 @@ public class MappingProfile : Profile CreateMap().ReverseMap(); // --- 触发器映射 --- - CreateMap() + CreateMap() .ReverseMap(); } } diff --git a/DMS.Infrastructure/Repositories/TriggerRepository.cs b/DMS.Infrastructure/Repositories/TriggerRepository.cs index 5750e6c..e42de04 100644 --- a/DMS.Infrastructure/Repositories/TriggerRepository.cs +++ b/DMS.Infrastructure/Repositories/TriggerRepository.cs @@ -36,20 +36,20 @@ namespace DMS.Infrastructure.Repositories /// /// 触发器定义的唯一标识符。 /// 对应的触发器定义实体,如果不存在则为null。 - public async Task GetByIdAsync(int id) + public async Task GetByIdAsync(int id) { var dbTrigger = await base.GetByIdAsync(id); - return _mapper.Map(dbTrigger); + return _mapper.Map(dbTrigger); } /// /// 异步获取所有触发器定义。 /// /// 包含所有触发器定义实体的列表。 - public async Task> GetAllAsync() + public async Task> GetAllAsync() { var dbList = await base.GetAllAsync(); - return _mapper.Map>(dbList); + return _mapper.Map>(dbList); } /// @@ -57,7 +57,7 @@ namespace DMS.Infrastructure.Repositories /// /// 要添加的触发器定义实体。 /// 添加成功后的触发器定义实体(包含数据库生成的ID等信息)。 - public async Task AddAsync(TriggerDefinition entity) + public async Task AddAsync(Trigger entity) { var dbTrigger = _mapper.Map(entity); var addedDbTrigger = await base.AddAsync(dbTrigger); @@ -69,7 +69,7 @@ namespace DMS.Infrastructure.Repositories /// /// 要更新的触发器定义实体。 /// 受影响的行数。 - public async Task UpdateAsync(TriggerDefinition entity) + public async Task UpdateAsync(Trigger entity) { var dbTrigger = _mapper.Map(entity); return await base.UpdateAsync(dbTrigger); @@ -80,7 +80,7 @@ namespace DMS.Infrastructure.Repositories /// /// 要删除的触发器定义实体。 /// 受影响的行数。 - public async Task DeleteAsync(TriggerDefinition entity) + public async Task DeleteAsync(Trigger entity) { return await base.DeleteAsync(_mapper.Map(entity)); } @@ -106,17 +106,17 @@ namespace DMS.Infrastructure.Repositories /// /// 要获取的触发器定义数量。 /// 包含指定数量触发器定义实体的列表。 - public new async Task> TakeAsync(int number) + public new async Task> TakeAsync(int number) { var dbList = await base.TakeAsync(number); - return _mapper.Map>(dbList); + return _mapper.Map>(dbList); } - public async Task> AddBatchAsync(List entities) + public async Task> AddBatchAsync(List entities) { var dbEntities = _mapper.Map>(entities); var addedEntities = await base.AddBatchAsync(dbEntities); - return _mapper.Map>(addedEntities); + return _mapper.Map>(addedEntities); } } } \ No newline at end of file diff --git a/DMS.WPF/App.xaml.cs b/DMS.WPF/App.xaml.cs index 8ce1099..f57e0ab 100644 --- a/DMS.WPF/App.xaml.cs +++ b/DMS.WPF/App.xaml.cs @@ -271,6 +271,8 @@ public partial class App : System.Windows.Application services.AddSingleton(); // 注册触发器管理服务 services.AddSingleton(); // 注册触发器评估服务 services.AddSingleton(); // 注册触发器动作执行器 + services.AddSingleton(); // 注册触发器变量管理服务 + services.AddSingleton(); // 注册触发器变量应用服务 services.AddSingleton(); services.AddSingleton(); diff --git a/DMS.WPF/Interfaces/ITriggerDataService.cs b/DMS.WPF/Interfaces/ITriggerDataService.cs index d5b2eb0..491efee 100644 --- a/DMS.WPF/Interfaces/ITriggerDataService.cs +++ b/DMS.WPF/Interfaces/ITriggerDataService.cs @@ -17,7 +17,7 @@ public interface ITriggerDataService /// /// 添加触发器。 /// - Task AddTrigger(TriggerItem dto); + Task AddTrigger(TriggerItem triggerItem); /// /// 删除触发器。 diff --git a/DMS.WPF/Services/TriggerDataService.cs b/DMS.WPF/Services/TriggerDataService.cs index 6f97ea7..53efa62 100644 --- a/DMS.WPF/Services/TriggerDataService.cs +++ b/DMS.WPF/Services/TriggerDataService.cs @@ -59,15 +59,15 @@ public class TriggerDataService : ITriggerDataService /// /// 添加触发器。 /// - public async Task AddTrigger(TriggerItem dto) + public async Task AddTrigger(TriggerItem triggerItem) { // 添加null检查 - if (dto == null) + if (triggerItem == null) return null; var addDto = await _appCenterService.TriggerManagementService.CreateTriggerAsync( - _mapper.Map(dto)); + _mapper.Map(triggerItem)); // 添加null检查 if (addDto == null) diff --git a/DMS.WPF/ViewModels/TriggersViewModel.cs b/DMS.WPF/ViewModels/TriggersViewModel.cs index 96109d4..ae11ce1 100644 --- a/DMS.WPF/ViewModels/TriggersViewModel.cs +++ b/DMS.WPF/ViewModels/TriggersViewModel.cs @@ -105,7 +105,7 @@ namespace DMS.WPF.ViewModels } // 传递副本以避免直接修改原始对象 - var triggerToEdit = _mapper.Map(SelectedTrigger); + var triggerToEdit = _mapper.Map(SelectedTrigger); TriggerDialogViewModel viewModel = App.Current.Services.GetRequiredService(); await viewModel.OnInitializedAsync(triggerToEdit);