using AutoMapper; using DMS.Application.Interfaces.Database; using DMS.Core.Interfaces; using DMS.Core.Models.Triggers; using System.Collections.Generic; using System.Threading.Tasks; using System.Linq; using System.Diagnostics; using DMS.Application.Interfaces; using DMS.Application.DTOs; namespace DMS.Application.Services.Database { /// /// 触发器应用服务,负责处理触发器相关的业务逻辑。 /// 实现 接口。 /// public class TriggerAppService : ITriggerAppService { private readonly IRepositoryManager _repositoryManager; /// /// 构造函数,通过依赖注入获取仓储管理器和AutoMapper实例。 /// /// 仓储管理器实例。 /// AutoMapper 实例。 public TriggerAppService(IRepositoryManager repositoryManager) { _repositoryManager = repositoryManager; } /// /// 异步根据ID获取触发器定义。 /// /// 触发器ID。 /// 触发器定义实体。 public async Task GetTriggerByIdAsync(int id) { var dbTrigger = await _repositoryManager.Triggers.GetByIdAsync(id); return dbTrigger; } /// /// 异步获取所有触发器定义。 /// /// 触发器定义实体列表。 public async Task> GetAllTriggersAsync() { var triggers = await _repositoryManager.Triggers.GetAllAsync(); var triggerVariables = await _repositoryManager.TriggerVariables.GetAllAsync(); foreach (var trigger in triggers) { // 加载关联的变量ID var variables = triggerVariables.Where(t=>t.TriggerDefinitionId==trigger.Id).ToList(); // trigger.Variables = variables; } return triggers; } /// /// 异步创建一个新触发器定义及其关联的变量ID。 /// /// 要创建的触发器定义。 /// 新创建的触发器定义。 public async Task AddTriggerAsync(Trigger trigger) { try { await _repositoryManager.BeginTranAsync(); // 添加触发器定义 var addedTrigger = await _repositoryManager.Triggers.AddAsync(trigger); await _repositoryManager.CommitAsync(); return addedTrigger; } catch { await _repositoryManager.RollbackAsync(); throw; } } /// /// 异步创建触发器及其关联菜单。 /// /// 包含触发器和菜单信息的数据传输对象。 /// 包含新创建触发器和菜单信息的数据传输对象。 public async Task CreateTriggerWithMenuAsync(CreateTriggerWithMenuDto dto) { try { await _repositoryManager.BeginTranAsync(); // 创建触发器 var createdTrigger = await _repositoryManager.Triggers.AddAsync(dto.Trigger); if (createdTrigger == null || createdTrigger.Id == 0) { throw new InvalidOperationException($"添加触发器失败:{createdTrigger}"); } // 确保DTO中的触发器对象也更新为新创建的触发器 dto.Trigger = createdTrigger; // 创建菜单 if (dto.TriggerMenu != null) { // 使用现有的菜单查找逻辑来获取父菜单 //var parentMenu = await _repositoryManager.Menus.GetMenuByTargetIdAsync(Core.Enums.MenuType.TriggerMenu, 0); //if (parentMenu != null) //{ // // 设置菜单的关联信息 // dto.TriggerMenu.ParentId = parentMenu.Id; // dto.TriggerMenu.MenuType = Core.Enums.MenuType.TriggerMenu; // dto.TriggerMenu.TargetId = createdTrigger.Id; // // 添加菜单到数据库 // var addMenu = await _repositoryManager.Menus.AddAsync(dto.TriggerMenu); // if (addMenu == null || addMenu.Id == 0) // { // throw new InvalidOperationException($"添加触发器菜单失败:{addMenu}"); // } // // 更新dto中的菜单对象 // dto.TriggerMenu = addMenu; //} } await _repositoryManager.CommitAsync(); return dto; } catch (Exception ex) { await _repositoryManager.RollbackAsync(); throw new ApplicationException($"创建触发器及其菜单时发生错误,操作已回滚,错误信息:{ex.Message}", ex); } } /// /// 异步更新一个已存在的触发器定义及其关联的变量ID。 /// /// 要更新的触发器定义。 /// 受影响的行数。 public async Task UpdateTriggerAsync(Trigger trigger) { try { await _repositoryManager.BeginTranAsync(); // 更新触发器定义 var rowsAffected = await _repositoryManager.Triggers.UpdateAsync(trigger); await _repositoryManager.CommitAsync(); return rowsAffected; } catch { await _repositoryManager.RollbackAsync(); throw; } } /// /// 异步删除一个触发器定义及其关联的变量关系。 /// /// 要删除的触发器ID。 /// 如果删除成功则为 true,否则为 false。 public async Task DeleteTriggerByIdAsync(int id) { try { await _repositoryManager.BeginTranAsync(); // 删除触发器本身 var trigger = await _repositoryManager.Triggers.GetByIdAsync(id); if (trigger == null) { return false; } var rowsAffected = await _repositoryManager.Triggers.DeleteAsync(trigger); await _repositoryManager.CommitAsync(); return rowsAffected > 0; } catch { await _repositoryManager.RollbackAsync(); throw; } } /// /// 异步获取指定变量ID关联的所有触发器定义。 /// /// 变量ID。 /// 与指定变量关联的触发器定义实体列表。 public async Task> GetTriggersByVariableIdAsync(int variableId) { var stopwatch = new Stopwatch(); stopwatch.Start(); // // // 获取关联的触发器ID列表 // var triggerIds = await _repositoryManager.GetTriggerIdsByVariableIdAsync(variableId); // var triggers = new List(); // if (triggerIds.Any()) // { // // 获取所有关联的触发器 // foreach (var triggerId in triggerIds) // { // var trigger = await GetTriggerByIdAsync(triggerId); // if (trigger != null) // { // triggers.Add(trigger); // } // } // } stopwatch.Stop(); // 可选:记录日志 // _logger.LogInformation($"GetTriggersByVariableId for VariableId={variableId},耗时:{stopwatch.ElapsedMilliseconds}ms"); return null; } } }